概念
在运行过程中,可以获得任何一个类的属性/方法,能够调用任何一个对象的属性/方法.动态获取信息和调用对象的功能称为反射.
具体功能
- 运行时判断一个对象的所属类
- 运行时调用一个对象的方法
- 运行时构造一个类的对象
- 运行时判断一个类所具有的成员变量和方法
- 生成动态代理
API
根据类获得Class对象
Class.forName(xxxx);
xxxx是类/java.lang.String完全限定名Class<?> className = xxxx.class;
Class<?> className = xxxx.getClass();
判断对象是否是某个类的实例
xxxx.isInstance(Object object);
- 根据对象创建新的实例
Class<?> className = xxxx.class;
Object ccccc = className.newInstance();Class<?> className = xxx.class;
Constructor constructor = className.getConstructor(xxx.class);
Object object = constructor.newInstance("xx")
- 根据类获取类的方法
className.getDeclaredMethods()
获取类/接口 的所有方法(包括私有,除了继承的方法)className.getMethods()
获取类的public方法及其继承类的public方法(包括Object的通用方法…)className.getMethod("方法名", 参数对象(int.class), 参数对象(int.class),....)
获取特定方法
- 根据类获取类的成员变量
className.getFiled();
访问public变量className.getFileds();
className.getDeclaredField()
访问所有成员变量,但不包括父类成员变量className.getDeclaredFields()
- 调用类中的方法
Object object = className.newInstance();
Method method = className.getMethod("方法名", args[className]);
Object result = method.invoke(object, args[])
- 反射创建数组
Object array = Array.newInstance(className, 16);
Array.set(array, 0, arg[className]);
注意:反射invoke()调用方法可能会破坏封装性,造成安全问题.
借鉴于:
https://www.sczyh30.com/posts/Java/java-reflection-1/
https://www.tianmaying.com/tutorial/Java