package com.lixinyang.myreflect.ReflectAndAnnotation; import android.app.Activity; import android.view.View; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * author:Created by WangZhiQiang on 2018/1/24. */ public class Utils { public static void setContent(Activity activity){ injectContenView(activity); injectBindView(activity); injectOnClick(activity); } private static void injectOnClick(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) { SetOnClick click = method.getAnnotation(SetOnClick.class);//通过反射api获取方法上面的注解 if (click != null) { if (click.value() == -1) return; View view = activity.findViewById(click.value());//通过注解的值获取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(); } } }); } } } private static void injectBindView(Activity activity) { //通过反射获取到Activity的字节码 Class clazz = activity.getClass();//第一种方式 Class clazz2 = Activity.class;//第二种方式 try { Class aClass = Class.forName("com.lixinyang.myreflect.MainActivity");//第三种方式 } catch (ClassNotFoundException e) { e.printStackTrace(); } //获取到类里面的所有属性 Field[] fields = clazz.getDeclaredFields(); //判断数组里面是否为空 if(fields!=null&&fields.length>=0){ //foreach遍历数组里面的属性 for (Field field : fields) { //设置暴力破解私有属性 field.setAccessible(true); //成员变量上的注解值 BindView bindview = field.getAnnotation(BindView.class); //判断当注解不为空的时候 if(bindview!=null){ //获取到里面的属性 int id = bindview.value(); /* //通过Activity的fandViewById方法装换成View对象 View view = activity.findViewById(id);*/ try { //通过反射获取到findviewById方法 Method method = clazz.getMethod("findViewById", int.class); //通过invoke方法赋值并转换成View类型 View view = (View) method.invoke(activity, id); //通过反射方法,初始化成员变量 field.set(activity,view ); } catch (Exception e) { e.printStackTrace(); } } } } } private static void injectContenView(Activity activity) { //通过反射获取到Activity的字节码 Class clazz = activity.getClass();//第一种方式 Class clazz2 = Activity.class;//第二种方式 try { Class aClass = Class.forName("com.lixinyang.myreflect.MainActivity");//第三种方式 } catch (ClassNotFoundException e) { e.printStackTrace(); } //得到类上面的注解 ContentView annotation = (ContentView) clazz.getAnnotation(ContentView.class); //判断获取到的AContenView对象是否为空 if(annotation!=null){ //获取里面的值 int layoutid = annotation.value(); try { //获取到activity里面的方法 Method method = clazz.getMethod("setContentView", int.class); //给setContentView强制性赋值 method.invoke(activity,layoutid); } catch (Exception e) { e.printStackTrace(); } } } }