Java反射机制
我们都知道面向对象的三大特性:继承、封装、多态。而封装就是指用关键字private修饰,用private修饰的属性则认为是私有的,外界不可访问的,更不用说修改某些私有属性了,但是私有就很安全吗?
no,反射可以搞定它,反射可以根据对应类的字节码生成一个Class类的一个实例化对象,通过这个实例化对象调用Class类中的一些封装好的方法就可以实现运行时期的对象创建、运行时的方法调用、运行时的属性获取、运行时的属性修改。
为什么是运行时的操作呢?
因为要知道运行的时候是将字节码加载到JVM中,在类加载中有一步是加载,这一步做的就是由对应的字节码文件加载一个Class对象,而我们反射机制其实和加载时的操作基本相同,所以将这些操作叫做运行时的操作。
那么到底什么是反射?
其实就和表面意思差不多,利用字节码映射出一个Java.lang.Class类的一个实例化对象,同过这个对象中的封装好的方法反射出对应类中的属性、方法、构造方法等等,进而进行一系列操作。
那么在java中反射的具体实现是怎样的呢?
为了演示,我先创建了一个Student类
class Student{
private int id;
private String name;
public Student(){
}
private Student(int id,String name){
this.id=id;
this.name=name;
}
private void show(){
System.out.println("学号"+this.id+"姓名"+this.name);
}
}
获得Class对象(三种方式)
//创建class对象
Student stu=new Student();
Class<?>sc=stu.getClass();//第一种创建class对象的方法
Class<?>sc2=Student.class;//第二种创建方式
Class<?>sec3=Class.forName("Student");//第三种创建方式,参数为对应类的全限定名
获取构造方法(四种方式)constructor
注意:对于获取单个构造方法来说,getConstructor()或getDeclaredConstructor()的参数根据对应类的构造方法的参数格式进行传参,获取哪个构造方法就要传入对应构造方法的参数类型的Class对象,例如int对应的就是int.class。
Constructor<?>constructor=sc.getConstructor()