// 任何一个类都有一个静态的class变量,为Class类型,用于描述一个类或接口的结构信息
A a = new A();
// 接口同样具有此特性
Class c = a.getClass()
Class c = A.class
// 基本数据类型的类包装,如Integer.class指Integer引用类型,Integer.TYPE指int基本类型
// c可以描述任何一个引用类型的结构,?必须是引用类型
Class<?> c
// c仅可以描述T类型的结构,T是泛型,实际指代何种类型,在程序运行后确定
Class<T> c
// c仅可以描述Student类型的结构
Class<Student> c
// c可以描述Student类型及其该类型的子类类型的结构
Class<? extends Student> c
// 反射的本质是通过该类型的Class类型变量,来获取其描述的类型的各种信息,而后再做出相应的操作
// 通过类的完全限定名,利用Class类的静态方法加载类到jvm,并返回已加载类的Class类型的变量
Class<Stident> c = Class.forName("com.lnu.reflect.Student");
// 获取类Student的全部访问修饰符为public的属性
Field[] fields = c.getFields();
// 获取类Student的已经声明的全部属性
Field[] fields = c.getDeclaredFields();
// 返回属性fields[i]的名字
String name = fields[i].getName();
// 获取属性fields[i]的访问修饰符编码
int code = fields[i].getModifiers();
// 返回编码对应的访问修饰符
Modifier.toString(code);
// 获取类Student的全部访问修饰符为public的方法
Method[] methods = c.getMethods();
// 获取类Student的已经声明的全部方法
Method[] methods = c.getDeclaredMethods();
// 实例化一个实例
Object obj = c.newInstance();
// 获取方法
Class<?> paramsClass = {param1的Class类型变量,param2的Class类型变量, ..};
Method method = c.getDeclaredMethod(“方法名字”, paramsClass);
// 方法参数变量值数组
// 设置方法的执行权限,使其可以执行私有方法
// 执行方法
Object[] paramsVal = {param1,param2, ..};
method.setAccessible(true);
method.invoke(obj, paramsVal);
// 获取属性
// 设置属性的访问权限,使其可以访问私有属性
Field field = c.getDeclaredField(“属性名”);
field.setAccessible(true);
// 获取类的实例obj的属性field的值
field.get(obj);
// 设置类的实例obj的属性field的值为value
field.set(obj, value);
反射
最新推荐文章于 2021-10-02 22:32:26 发布