Android利用反射和注解实现View注入

309 阅读1分钟

一、实现需求

利用反射和注解方式,模拟ButterKnif实现View注入。

二、实现步骤

** 1、创建注解InjectView **

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface InjectView {
    @IdRes int value();
}

** 2、反射工具类 **

public class InjdectUtils {

    public static void injectView(Activity activity) {
        Class<? extends Activity> cls = activity.getClass();
        Field[] declaredFields = cls.getDeclaredFields();
        for (Field field : declaredFields) {
            //判断属性是否被有InjectView注解
            if (field.isAnnotationPresent(InjectView.class)) {
                InjectView in = field.getAnnotation(InjectView.class);
                // 获取注解中设置的id
                int id = in.value();
                View viewById = activity.findViewById(id);
                //设置能够操作private属性的权限
                field.setAccessible(true);
                try {
                    //把获取的view实例设置到属性上
                    field.set(activity, viewById);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

** 3、MainActivity **

public class MainActivity extends AppCompatActivity {

    //加入自定义注解
    @InjectView(R.id.tv)
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //使用反射赋值
        InjdectUtils.injectView(this);
        tv.setText("annotation injectView");
    }
}