反射和注解本就是一家人,注解离不开反射,这里先将反射的写法,本文涉到的注解暂时可以不不用理解
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.class
Class<?> 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);
打印结果如下: