ContentView
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ContentView {
int value();
}
BindView
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface BindView { int value(); }
OnClick
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface OnClick { int [] value(); }
MainActivity
@ContentView(R.layout.activity_main) public class MainActivity extends AppCompatActivity { @BindView(R.id.test1) TextView textView; @BindView(R.id.img) ImageView mImageView; @BindView(R.id.test2) TextView textView1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Util.setContent(this); textView.setText("hahaha"); textView1.setText("hehehe"); } @OnClick(R.id.test1) public void aa() { Toast.makeText(MainActivity.this, "hehe", Toast.LENGTH_SHORT).show(); } @OnClick(R.id.img) public void bb() { Toast.makeText(MainActivity.this, "haha", Toast.LENGTH_SHORT).show(); } @OnClick(R.id.test2) public void cc() { Toast.makeText(MainActivity.this, "haha", Toast.LENGTH_SHORT).show(); } }
Util
public static void setContent(Activity activity) { setcontentview(activity); setbindview(activity); setonclick(activity); } public static void setcontentview(Activity activity) { Class clazz = activity.getClass(); ContentView annotation = (ContentView) clazz.getAnnotation(ContentView.class); int value = annotation.value(); try { Method method = clazz.getMethod("setContentView", int.class); method.invoke(activity, value); } catch (Exception e) { e.printStackTrace(); } } public static void setbindview(Activity activity) { //获取类 Class< ? extends Activity> recfClass=activity.getClass(); //获取类中的所有field(域/变量) Field[] fields = recfClass.getDeclaredFields(); //对获取到的field做遍历 for(Field field:fields){ //对遍历到的field做判断,是否带特定注解标识 if(field.isAnnotationPresent(BindView.class)){ //获取到该field的注解 BindView bindView= field.getAnnotation(BindView.class); //获取到该field的注解的value int id= bindView.value(); //设置属性 field.setAccessible(true); try { //对该field做控件绑定操作 field.set(activity,activity.findViewById(id)); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } } } } public static void setonclick(final Activity activity) { Class clazz = activity.getClass();//第一种方式 /* Class clazz2 = Activity.class;//第二种方式 try { Class aClass = Class.forName("com.lixinyang.myreflect.MainActivity");//第三种方式 } catch (ClassNotFoundException e) { e.printStackTrace(); }*/ //获取到里面的所有方法 Method[] methods = clazz.getMethods(); //foueach进行循环遍历 for (final Method method : methods) { OnClick click = method.getAnnotation(OnClick.class);//通过反射api获取方法上面的注解 if (click != null) { int[] value = click.value(); for (int i : value) { if (i == -1) return; View view = activity.findViewById(i);//通过注解的值获取View控件 if (view == null) return; view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { method.invoke(activity);//通过反射来调用被注解修饰的方法 } catch (Exception e) { e.printStackTrace(); } } }); } } } }