反射和注解本就是一家人,注解离不开反射,这里先将反射的写法,本文涉到的注解暂时可以不不用理解
1,创建一个类
public class ReflexUser {public String name;private String namePrivate;protected String nameProtected;String nameDefault;public void setName(String name) {this.name = name;Log.e("ReflexUser", "setName: " + name);}protected String getNameProtected() {return nameProtected;}String getNameDefault() {return nameDefault;}private String getNamePrivate() {return namePrivate;}public String getName() {Log.e("ReflexUser", "getName: " + name);return name;}}
2,执行反射相关操作
//反射创建对象//反射获取class对象,相当于获取到加载到内存的ReflexUser.classClass<?> classR = Class.forName("com.kx.jetpack.reflex.own.ReflexUser");//反射创建class实例 ,这里相当于new ReflexUser(),如果ReflexUser这个类在其它库中,无法new 可以通过这个方法创建对象Object o = classR.newInstance();//反射获取对象方法并且执行//根据名字获取class中的方法,这里相当于获取到ReflexUser中getName()这个方法Method getName = classR.getMethod("getName", null);//根据名字获取class中的方法,这里相当于获取到ReflexUser中setName()这个方法//getMethod(String name, Class<?>... parameterTypes)有两个参数,//String name:class中的方法名字//Class<?>... parameterTypes:可变参数,这里相当于方法中设置的参数的类型的class,如果没有就为空//这里的getName没有传入的null,setName有一个String类型,所以传入的为String.class//getMethod:只能获取到public方法的方法//getDeclaredField:获取所有方法Method setName = classR.getMethod("setName", String.class);//执行类的方法,相当余ReflexUser.setName方法setName.invoke(o, "Reflex Method");//执行类的方法,相当余ReflexUser.getName方法//Object invoke(Object obj, Object... args)//Object obj:传入通过反射创建的对象//Object... args:可变参数,传入对应方法中的值getName.invoke(o, null);//反射获取字段//并对字段进行操作,这里获取到ReflexUser中name字段//getField(String name)通过名字获取字段,只能获取到public字段//getDeclaredField(String name):通过名字获取字段,所有的//这里相当于获取到ReflexUser.name这个字段Field field = classR.getField("name");//对字段进行赋值//set(Object obj, Object value):Object obj:传入反射创建的对象,Object value:需要修改的值field.set(o, "Reflex field");//执行获取到的方法反射打印值是否修改成功getName.invoke(o, null);
打印结果如下: