反射是什么?
反射,是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。对于Java来说,反射就是操作类的Class对象来让我们可以在程序运行时发现和使用类的所有信息。当然如果没有了解Java的类的加载,可能看到这里会有个疑惑,直接New这个对象不就完了,为什么还需要反射?
那么首先我们都知道Java具有平台无关性,而之所以具有平台无关性,是因为Java会使用Javac编译,生成对应类的字节码,也就是.class文件,然后使用对应不同平台的JVM进行解析,转换成特定平台的执行指令。也就是说,我们每使用一个类,Java就会产生一个对应的Class对象。而生成这个class对象,会使用不同的类加载器进行加载。
关于类加载器,建议另外再详细学习一下。这里就不赘述了。我们这里只需要知道,从.java到.class这个过程。而如果我们现在有一个需求,现在我有A类以及B类,我想根据运行进行加载不同的类,那么这个时候,是不是就需要用到反射了。
反射的具体使用
创建测试类Student
public class Student{
private String name;
private String sex;
private int age;
}
创建Class对象
使用对象.getClass()获取
Student student=new Student();
Class class=student.getClass();
根据类名.class来获取
Class class=Student.class;
使用Class.forName()方法获取,其中参数必须为带包名的类路劲
Class class=Class.forName("com.scominfo.demo01.entity.Student");
第一种方法已经实例化对象了,再用反射没必要。第三种方法需要导入包路劲,不太方便,所以一般我们使用第二种方法。
使用反射
当我们获取到Class对象之后,就可以开始对其进行操作了。
获取公有构造方法
使用Class类中的getConstructors()方法获取到所有Public的构造方法列表、
Class studentClass = Class.forName("com.scominfo.demo01.entity.Student");
Constructor[] constructors = studentClass.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
查看打印结果如下:
public com.scominfo.demo01.entity.Student(java.lang.String,java.lang.String,int)
public com.scominfo.demo01.entity.Student()
获取全部构造方法
通过以上方法获取,我们发现没有找到private的构造函数。如果想要获取"public,protected,default,privite"的构造函数,则应该使用getDeclaredConstructors()方法。
Class studentClass = Class.forName("com.scominfo.demo01.entity.Student");
Constructor[] constructors = studentClass.getDeclaredConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
查看打印结果如下:
private com.scominfo.demo01.entity.Student(java.lang.String)
public com.scominfo.demo01.entity.Student(java.lang.String,java.lang.String,int)
<