一.何为反射:
反射就是动态加载对象,并对对象进行剖析。在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法,这种动态获取信息以及动态调用对象方法的功能成为Java反射机制。
二.获得一个类的类对象有哪些方式?
(1)Class.forName(classname):用于做类加载
//根据给定的类名来获得,用于类加载
String classname = "com.luo.reflect.Person"; //来自配置文件
Class clazz1 = Class.forName(classname); //此对象代表Person.class
(2)对象.getClass():用于获得对象的类型
//如果拿到了对象,不知道是什么类型,用于获得对象的类型
Object obj = new Person();
Class clazz2 = obj.getClass(); //获得对象具体的类型
(3)类名.class:用于获得指定的类型,传参用
//如果是明确地获得某个类的Class对象,主要用于传参
Class clazz3 = Person.class;
三.如何通过反射创建对象?
(1)调用空参数的构造函数:使用了Class类中的newInstance()方法。
//第一步:获取字节码文件
//①通过 Class.forName(“类名”)来获取字节码文件
Class clazz = Class.forName("com.luo.reflect.Person");
//②通过 类.class 通过加载器来获取字节码文件
clazz = Person.class;
//③通过 对象.getClass() 来获取字节码文件
Object obj = new Person("zhangsan", 19);
clazz = obj.getClass();
//第二步:通过节码文件,创建对象
Object obj = clazz.newInstance();
//该实例化对象的方法调用就是指定类中的空参数构造函数,给创建对象进行初始化。
(2)调用带参数的构造函数:先要获取指定参数列表的构造器,然后通过该构造函数的对象的newInstance(实际参数)进行对象的初始化。
public static void method_2() throws Exception {
//既然类中没有空参数的构造函数,那么只有获取指定参数的构造函数,用该函数来进行实例化。
Class clazz = Class.forName("com.luo.reflect.Person");
//获取一个带参数的构造器。
Constructor constructor = clazz.getConstructor(String.class,int.class);
//想要对对象进行初始化,使用构造器的方法newInstance();
Object obj = constructor.newInstance("zhagnsan",30);
//获取所有构造器。
Constructor[ ] constructors = clazz.getConstructors(); //只包含公共的
//constructors = clazz.getDeclaredConstructors(); //本类公有,包含私有的
for(Constructor con : constructors) {
System.out.println(con);
}
}