获取类的Class对象
直接通过类.class,获取其Class对象
Class manClass = Apple.class;
通过Class的forName方法
Class.forName("com.example.reflect.Apple");
通过类实例对象 getClass() 方法
Apple apple = new Apple();
Class<? extends Apple> class = apple.getClass();
获取构造方法
getConstructors() :获取当前类公有构造方法
getConstructor(Class<?>... parameterTypes):获取参数类型匹配的公有构造方法
getDeclaredConstructors():获取当前类所有构造方法,包括私有。
getDeclaredConstructor(Class<?>... parameterTypes):获取所有参数类型匹配的构造方法(公有+私有)
然后直接调用newInstance()创建实例。
获取方法
getMethods() 获取类本身及其父类所有公有方法
getMethod(String name, Class<?>... parameterTypes) 获取类本身及其父类通过方法名及参数类型指定的公有方法
getDeclaredMethods() 获取类本身所有方法
getDeclaredMethod(String name, Class<?>... parameterTypes) 通过类本身通过方法名及参数类型获取本类指定的方法,无限制
如果是私有方法,需要给与权限
xxx.setAccessible(true);
方法的调用:
Object invoke(Object obj, Object... args)
这个可以理解为跟正常的相反就好,一般我们是 对象.方法名,在反射中就是 方法名.invoke(对象)。
如果是静态方法,则如下操作:
public static ActivityThread currentActivityThread() {
return sCurrentActivityThread;
}
Method currentActivityThreadMethod = activityThreadClazz.getDeclaredMethod("currentActivityThread");
currentActivityThreadMethod.setAccessible(true);
Object activityThreadObj = currentActivityThreadMethod.invoke(null);
静态方法在invoke中传null.
费静态方法操作如下:
Apple apple = (Apple) appClass.newInstance();
Constructor constructor = appClass.getConstructor(String.class,int.class,int.class);
Apple apple1 = (Apple) constructor.newInstance("红色",10,5);
Method method = appClass.getDeclaredMethod("toString");
String str = (String) method.invoke(apple1);
获取成员变量
getFields() 获取类本身及其父类所有公有成员变量
getField(String name) 获取类本身及其父类指定的公有成员变量
getDeclaredFields() 获取类本身所有成员变量(私有,公有,保护)
getDeclaredField(String name) 获取类本身指定名字的成员变量
为成员变量赋值操作如下:
// 私有成员变量要赋予权限
address.setAccessible(true);
address.set(manClass.newInstance(), "重庆市");
phoneNum.set(manClass.newInstance(), 023);
网友评论