参考:
https://blog.csdn.net/smileiam/article/details/72771634
一. 定义注解类 @interface
一般添加两个注解
@Retention(RetentionPolicy.RUNTIME)
表示作用时效@Target(ElementType.FIELD)
表示这是变量注解- 添加方法体 T value(); T表示注解中的括号里面的值的类型
二. 定义一个注解处理类, 定义静态方法注入
注入步骤:
- 获取字节码
Class cls = activity.getClass();
- 获取该字节码中所有的字段
Field[] fields = cls.getDeclaredFields();
- 遍历所有的字段, 获取字段的注解(需要判空)
BindView bindView = field.getAnnotation(BindView.class);
- 获取注解中括号里面的值
bindView.value();
- 通过获取到的值做相应的事情,
- 给字段赋予权限
field.setAccessible(true);
- 给activity对象的field字段赋值为view对象
field.set(activity, view);
public static void inject(Activity activity) {
viewInject(activity);
methodInject(activity);
}
private static void viewInject(Activity activity) {
Class cls = activity.getClass();
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
BindView bindView = field.getAnnotation(BindView.class);
if (bindView != null) {
int viewId = bindView.value();
View view = activity.findViewById(viewId);
field.setAccessible(true);
try {
field.set(activity, view);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
private static void methodInject(final Activity activity) {
Class cls = activity.getClass();
Method[] methods = cls.getDeclaredMethods();
for (final Method method : methods) {
ViewClick viewClick = method.getAnnotation(ViewClick.class);
if (viewClick != null) {
int[] resIds = viewClick.value();
for (int resId : resIds) {
final View view = activity.findViewById(resId);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
method.setAccessible(true);
method.invoke(activity, view);
}
});
}
}
}
}