一、JAVA反射机制的基本知识点
1、JAVA反射机制是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法。
2、对于任意一个对象,都能够调用它的任意一个方法和属性
3、这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
4、 动态获取类中信息,就是java反射; 可以理解为对类的解剖。
二: Class对象的获取方式
1、一个Class的实例对象代表着一份内存中的字节码,就是系统加载其他类到内存中时调用的那一份字节码;
获取某个类或某个对象所对应的Class对象的常用的3种方式:
(1)某个类的实例对象getClass();如String s = “aa”; Class<?> clazz = s.getClass();
(2)Class.forName("该类的完整名称");如:Class.forName("java.lang.String")
(3)类名.class;如:String.class
当使用forName()方法时若此类已经被加载过,则直接返回此类的字节码映射;若还没有加载过,则虚拟机会先加载这个类到内存中,然后将其字节码的映射地址返回;
实体类代码:
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
System.out.println(this.name + ":" + this.age);
}
public Student() {
System.out.println("Student is demo");
}
}
2、一个类无论有多少个对象,他们的Class对象是同一个,也就是对应同一份字节码文件
public static void main(String[] args) {
Student s = new Student();
Class clazz = s.getClass();
Student s2 = new Student();
Class clazz2 = s2.getClass();
System.out.println(clazz == clazz2);
}
输出结果为:true
很好的验证了:一个类的所有Class对象都是同一个,都对应同一份字节码文件
三:反射获取构造方法
Constructor类:代表了一个类中的一个构造方法;
1、有无参构造函数的对象的创建
Class clazz = Class.forName("cn.itcast.bean.Student");
Object obj = clazz.newInstance();
其中通过Class的newInstance()方法建立类对象,改方法调用的是Class类对象所属类的默认空参构造函数
2、没有无参构造函数的对象的创建
Class clazz = Class.forName("cn.itcast.bean.Student");
Constructor cs = clazz.getConstructor(String.class,int.class);
Object obj = cs.newInstance("Student",20);
Class类对象有3种方法可以获取到Constructor类对象。
[1]. Class类的getConstructors()方法(获取某个类所有公共的构造函数)
[2]. Class类的getDeclaredConstructors()方法(获取某个类所有申明的构造函数)
[3]. Class类的 getConstructor(Class<?>...parameterTypes)方法(获取某个类指定的公共构造函数)
为了说明上面方式的不同,将其中Student类的一个构造方法私有化
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
System.out.println(this.name + ":" + this.age);
}
private Student() {
System.out.println("Student is demo");
}
}
测试代码:
1、getConstructors()方法
Class clazz = Class.forName("com.jtt.demo.Student");
Constructor[] cons = clazz.getConstructors();
for (Constructor con : cons) {
System.out.println(con);
}
输出结果:public com.jtt.demo.Student(java.lang.String,int)
其中:只显示出了公共的有参数构造函数,没有显示出私有的公共函数
2、getDeclaredConstructors()方法
Class clazz = Class.forName("com.jtt.demo.Student");
Constructor[] cons = clazz.getDeclaredConstructors();
for (Constructor con : cons) {
System.out.println(con);
}
输出结果:
publiccom.jtt.demo.Student(java.lang.String,int)
private com.jtt.demo.Student()
显示出了所有申明的构造函数
3、 Class类的 getConstructor(Class<?>...parameterTypes)方法
Class clazz = Class.forName("com.jtt.demo.Student");
Constructor con = clazz.getConstructor(String.class, int.class);
Object obj = con.newInstance("lisi", 20);
输出结果:lisi:20