注解&反射View注入

通过注解&反射技术实现View注入(Android)

1.在Activity中的应用

public class AnnotationReflectActivity extends AppCompatActivity {


    @InjectView(R.id.tv_show)
    TextView tvShow;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_annotation_reflect);
InjectUtils.injectView(this);//方法调用 tvShow.setText("tv show."); } }

 2.注解

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface InjectView {

    @IdRes int value();
}

3.反射

public class InjectUtils {
    
    public static void injectView(Activity activity) {

        Class<? extends Activity> clazz = activity.getClass();

        //clazz.getFields() 获得自己+父类的成员(父类不包括private,只是public)
        //clazz.getDeclaredFields() 获得自己的成员

        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field field : declaredFields) {
            if(field.isAnnotationPresent(InjectView.class)) {

                InjectView injectView = field.getAnnotation(InjectView.class);

                //获得注解中设置的id
                int id = injectView.value();
                View view = activity.findViewById(id);

                //设置访问权限,允许操作private属性
                field.setAccessible(true);

                try {
                    //反射赋值
                    field.set(activity, view);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

  

posted @ 2020-11-03 14:49  黑冰台  阅读(167)  评论(0)    收藏  举报