通过注解&反射技术实现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(); } } } } }
原文:https://www.cnblogs.com/heibingtai/p/13920251.html