无法使用自定义批注

时间:2016-07-28 10:23:22

标签: java android annotations

这里我正在创建一个自定义注释来使用资源ID绑定view。这个注释在模拟器中运行良好,但在真实设备中不起作用。

Bind.class

@Retention(RetentionPolicy.CLASS)
@Target(ElementType.FIELD)
public @interface Bind {

}

Binder.class

public class Binder {
    @SuppressWarnings("TryWithIdenticalCatches")
    public static void bind(AppCompatActivity activity) {
        for(Field field : activity.getClass().getDeclaredFields()) {
            field.setAccessible(true);
            Bind annotation = field.getAnnotation(Bind.class);
            if (annotation != null) {
                try {
                    Field id = R.id.class.getDeclaredField(field.getName());
                    field.set(activity, activity.findViewById(id.getInt(id)));
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

SampleActivity.class

public class SampleActivity extends AppCompatActivity {

    @Bind private Toolbar toolbar;
    @Bind private Button btnLogin;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        Binder.bind(this);
        setSupportActionBar(toolbar);
        btnLogin.setText("LOGIN");
    }
}

当我在设备中运行时,binder无法初始化字段并抛出NullPointerException

E/AndroidRuntime: FATAL EXCEPTION: main
E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{in.company.timesheet/in.company.timesheet.SampleActivity}: java.lang.NullPointerException
E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2309)
E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2366)
E/AndroidRuntime:     at android.app.ActivityThread.access$600(ActivityThread.java:156)
E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1343)
E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:153)
E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5330)
E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime:  Caused by: java.lang.NullPointerException
E/AndroidRuntime:     at in.company.timesheet.SampleActivity.onCreate(SampleActivity.java:20)
E/AndroidRuntime:     at android.app.Activity.performCreate(Activity.java:5135)
E/AndroidRuntime:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081)
E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2273)
E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2366) 
E/AndroidRuntime:     at android.app.ActivityThread.access$600(ActivityThread.java:156) 
E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1343) 
E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:153) 
E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5330) 
E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608) 
E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)

知道我错过了什么吗?

0 个答案:

没有答案