Java基础:运用反射和注解实现findViewById功能

1、注解类
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface InjectView {
    @IdRes int value();
}
2、反射解析注解并赋值
public static void injectView(Activity activity) {
        Class cls = activity.getClass();

        //获得此类所有的成员
        Field[] declaredFields = cls.getDeclaredFields();
        for (Field filed : declaredFields) {
            // 判断属性是否被InjectView注解声明
            if (filed.isAnnotationPresent(InjectView.class)){
                InjectView injectView = filed.getAnnotation(InjectView.class);
                //获得了注解中设置的id
                int id = injectView.value();
                //第一种方法:通过反射获取findViewById方法(主要演示反射的作用)
                Method method = cls.getMethod("findViewById",int.class);
                View view = (View)method.invlke(activity,id);
                //第二种方法:直接通过activity.findViewById方法
                //View view = activity.findViewById(id);
                //反射设置 属性的值
                filed.setAccessible(true); //设置访问权限,允许操作private的属性
                try {
                    //反射赋值
                    filed.set(activity,view);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
3、使用

 @InjectView(R.id.tv)
    private TextView tv;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        InjectUtils.injectView(this);
        tv.setText("小三爷!!!");
   }

你可能感兴趣的:(Java基础:运用反射和注解实现findViewById功能)