源码地址:https://github.com/ldy1993/ToolforAS.git
实例一:这个注解用于自动绑定Activity中的控件。
如果用反射来调用类中方法。先创建一个findViewById的注解
注意的是这里需要使用元注解
所谓元注解,就是加在注解上的注解。
其中
- @Documented
用于制作文档,不是很重要,忽略便是
- @Target
加在注解上,限定该注解的使用位置,比如方法或者成员字段是否可以加注解。暂时不用理会。
- @Retention(注解的保留策略)
注解的保留策略有三种:SOURCE/ClASS/RUNTIME
SOURCE代表注解保留在java文件中。
ClASS代表注解保留在磁盘的Class文件中
RUNTIME代表了注解保留在运行内存的Class文件中。
所以要想使用反射。需要使得注解保留在内存的Class文件中。如下
编译器代码
public static void findViewByIdCompiler(Activity activity) {
Log.e("ldy","findViewByIdCompiler");
FindViewById value = null;
Class clazz = null;
try {
clazz = activity.getClass();
if (clazz != null) {
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(FindViewById.class)) {
value = field.getAnnotation(FindViewById.class);
Log.e("ldy","value="+value.value());
//判断该属性是否是属于View的子类类型,并且不是静态属性
if(View.class.isAssignableFrom(field.getType()) && !Modifier.isStatic(field.getModifiers())) {
Method method =clazz.getMethod("findViewById", int.class);
method.setAccessible(true);
//将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
Object view = method.invoke(activity, value.value());
try {
// 通过反射拿私有对象,需要加上这一句
field.setAccessible(true);
field.set(activity, view);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
然后再代码中使用注解
@FindViewById(R.id.bt_basic_characteristics) public Button bt_basic_characteristics;