反射

2021-03-18  本文已影响0人  风月寒
获取类的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);
上一篇下一篇

猜你喜欢

热点阅读