概述
能够分析类能力的程序成为反射reflective
。反射机制的功能及其强大,再下面可以看到,反射机制可以用来:
- 在运行时分析类的能力
- 在运行时查看对象,例如,编写一个
toString()
方法供所有类使用。 - 实现通用的数组操作代码。
- 利用
Method
对象,这个对象很像C++中的指针函数。
Class类
在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。
获取类字节码方式
- Class.forName(); 静态方法调用
Class<?> forName = Class.forName("path");
- 类型.class
Class<?> cls = Person.class;
- 对象.class
Person person = new Person();
Class<?> cls = person.class;
常用方法
// 返回描述类名为className的Class对象
static Class forName(String className);
// 返回类的实例对象,调用的是默认无参构造方法
Object newInstance();
Constructor类
/**
* 构造一个这个构造器所属类的新实例
* @param args 这个构造方法所需的形式参数
*/
Object newIntance(Object[] args);
/**
* 获取字节码中所有公开的构造方法
*/
Constructor[] getConstructors();
/**
* 获取所有的构造的方法,包括private修饰的
*/
Constructor<?>[] getDeclaredConstructors();
/**
* 获取指定形参类型,和数量的公开的构造方法
*/
Constructor<T> getConstructor(Class<?>... parameterTypes);
/**
* 获取指定形参类型,和数量的任何修饰符的构造方法
*/
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes);
Method类
/**
* 获取所有公开方法
*/
Method[] getMethods();
/**
* 获取所有方法,包括私有方法
*/
Method[] getDeclaredMethods();
/**
* 获取公开方法
* @param name 方法的名称
* @param parameterTypes 形式参数
*/
Method getMethod(String name, Class<?>... parameterTypes)
/**
* 获取指定方法,包括私有方法
* @param name 方法的名称
* @param parameterTypes 形式参数
*/
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
/**
* 调用方法
* @param obj 方法被调用对象
* @param args 形式参数列表
*/
Object invoke(Object obj, Object... args)
Field类
/**
* 获取所有公开成员变量
*/
Field[] getFields();
/**
* 获取所有成员变量
*/
Field[] getDeclaredFields()
/**
* 获取指定名称的公开的成员变量
*/
Field getField(String name)
/**
* 获取指定名称的成员变量
*/
Field getDeclaredField(String name)
/**
* 设置obj指定成员变量值value
* @param obj 需要修改的变量
* @param value 修改的值
*/
void set(Object obj, Object value)
/**
* 获取obj对象的指定成员变量值
*/
Object get(Object obj)
暴力反射
Field name = forName.getDeclaredField("name");
name.setAccessible(true);
来源:CSDN
作者:justLym
链接:https://blog.csdn.net/justLym/article/details/104682666