1.概述
1.反射机制
在编译的时候并不确定是哪一个类被加载,而是在程序运行的时候才加载.
指程序可以访问/检测和修改本身状态或行为的一种能力
2.作用
1.获取类型的相关信息
2.动态调用方法
3.动态创建对象
3.常见的类
Class
概述
用来描述类或接口的类型,描述类的类
作用
获取一个对象的类的信息
获取一个类的访问修饰符/成员/方法/构造方法已经超类
获取一个接口的常量和方法
创建一个在程序运行时才知道名字的类的实例
获取并设置一个在程序运行时才知道的类的实例的成员
检测在运行时才知道名字的对象的方法
4.测试类
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* @author chenjin
* @date 2019/12/21 13:53
*/
public class demo {
public static void main(String[] args) throws Exception{
//获取用户类
Class<?> aClass = Class.forName("User");
//获取当前类的
Class<demo> demoClass = demo.class;
//Class<?> aClass1 = this.getClass();
//获取构造方法(get德扩儿康思抓不特)
Constructor<?> declaredConstructor = aClass.getDeclaredConstructor();
//设置一下可以调用该构造方法的私有方法
// 可以调用是私有方法
declaredConstructor.setAccessible(true);
//创建一个实体映射
Object o = declaredConstructor.newInstance();
//获取他的方法
Method declaredMethod = aClass.getDeclaredMethod("sex");
Method declaredMethod1 = aClass.getDeclaredMethod("nax");
//
declaredMethod.setAccessible(true);
declaredMethod1.setAccessible(true);
Object invoke = declaredMethod.invoke(o);
Object invoke1 = declaredMethod1.invoke(o);
System.out.println(invoke);
System.out.println(invoke1);
//获取user的属性
Field age = aClass.getDeclaredField("age");
age.setAccessible(true);
System.out.println(age.get(o));
}
}
5.实体类
/**
* @author chenjin
* @date 2019/12/21 13:53
*/
public class User {
public User(){
System.out.println("调用了无惨公共构造方法");
};
public User(String s){
System.out.println("调用了有惨公共构造方法");
};
public String name;
private Integer age = 1;
public void sex() {
System.out.println("公共方法sex");
}
private void nax(){
System.out.println("私有方法nax");
}
}
7.getDeclaredConstructor
获取该类的构造器
8.newInstance
创建实例对象
9.setAccessible
设置允许在调用的时候不去检查权限
10.invoke
调用该方法