android BaseActivity$1.onClick 匿名内部类 this.getClass()问题

来源:互联网 发布:天津平面设计美工招聘 编辑:程序博客网 时间:2024/06/02 04:16

 
 我想写一个组件,可以利用注解的方式,自动找到这个View,并且可以找到点击事件的方法,像这样(注解类就不贴出来了):
 @ViewClick(viewId=R.id.clickBtn, clickMethod="btnClickMethod")
 private Button btnClick;
 但是中间遇到了一些问题,log如下所示:
 
12-27 19:04:51.090: W/System.err(14345): java.lang.IllegalArgumentException: expected receiver of type com.mobile.component.setting.SysSettingActivity, but got java.lang.Class<com.mobile.component.setting.SysSettingActivity>
12-27 19:04:51.100: W/System.err(14345):  at java.lang.reflect.Method.invokeNative(Native Method)
12-27 19:04:51.100: W/System.err(14345):  at java.lang.reflect.Method.invoke(Method.java:511)
12-27 19:04:51.100: W/System.err(14345):  at com.mobile.component.base.BaseActivity$1.onClick(BaseActivity.java:80)
12-27 19:04:51.100: W/System.err(14345):  at android.view.View.performClick(View.java:3538)
12-27 19:04:51.100: W/System.err(14345):  at android.view.View$PerformClick.run(View.java:14319)
12-27 19:04:51.100: W/System.err(14345):  at android.os.Handler.handleCallback(Handler.java:608)
12-27 19:04:51.100: W/System.err(14345):  at android.os.Handler.dispatchMessage(Handler.java:92)
12-27 19:04:51.100: W/System.err(14345):  at android.os.Looper.loop(Looper.java:156)
12-27 19:04:51.100: W/System.err(14345):  at android.app.ActivityThread.main(ActivityThread.java:5045)
12-27 19:04:51.100: W/System.err(14345):  at java.lang.reflect.Method.invokeNative(Native Method)
12-27 19:04:51.100: W/System.err(14345):  at java.lang.reflect.Method.invoke(Method.java:511)
12-27 19:04:51.100: W/System.err(14345):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-27 19:04:51.100: W/System.err(14345):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-27 19:04:51.100: W/System.err(14345):  at dalvik.system.NativeStart.main(Native Method)


分析:我在一个类的一个方法里面设置了点击事件,view.setOnClickListener(),所以com.mobile.component.base.BaseActivity$1.onClick(BaseActivity.java:80)这行log, BaseActivity$1.onClick这个就代表是匿名内部类,比如onclick就会这样显示;
在onClick方法中调用this.getClass()获得的就不是当前的这个类了,而是匿名内部类,类似:BaseActivity$1.onClick,所以总是提示我找不到我类的方法,所以我就这样:BaseActivity.this.getClass(),这样改造之后,获得的就是当前类了。

view.setOnClickListener(new OnClickListener(){
 @Override
 public void onClick(View v) {
  Method method;
   Log.i("tag", "BaseActivity.this = " + BaseActivity.this + "\n " + "BaseActivity.this.getClass() = " + BaseActivity.this.getClass());
   method = BaseActivity.this.getClass().getDeclaredMethod(clickMethod, View.class);
   if(method != null){
    method.invoke(BaseActivity.this, v);
   }else{
    throw new IllegalAccessException("no such method");
   }
  }
 } 
  
  
  

原创粉丝点击