反射概述:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
当我们new对象的时候,jvm会编译生成.class文件,并将这个文件加载到内存中的方法区,同时会产生一个class对象,这个class对象每个类只会产生一个,反射就是得到这个class对象,然后反向获得我们new出来的对象。
例:
public class Student {
private String name;
private String id;
private int age;
private char sex;
public Student(){
}
private Student(String name,String id,int age,char sex){
this.age = age;
this.name = name;
this.id = id;
this.sex =sex;
}
}
public class ReflectDemo {
public static void main(String[] args) {
//获取Class对象
//方式一:Object中的getClass方法
Student student = new Student();
Class cls1 = student.getClass();
//方式二:通过类的属性
Class cls2 = Student.class;
//方式三:通过Class类的静态方法forname
try {
Class cls3 = Class.forName("ClassDemo.ReflectDemo");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
上述例子就是通过反射获得class对象的过程。
那我们获得class对象有什么用呢?
1.可以获得和使用对应类的构造方法
Class cls3 = Class.forName("ClassDemo.ReflectDemo");
Constructor cons = cls3.getConstructor();
//获得无参构造,这个方法只能获得公共的构造方法
Constructor cons2 = cls3.getDeclaredConstructor(String.class,String.class,int.class,char.class);
//获得私有的构造这个方法能获得所有访问权限的构造
Constructor[] conss = cls3.getDeclaredConstructors();
//获得一个类所有的构造有Declared这个单词的方法就表示不受访问修饰符影响
2.可以获得和使用对应类的成员变量
Field field1 = cls3.getField("name");
Field field2 = cls3.getDeclaredField("id");
//需要获得哪个成员变量就传哪个变量的变量名
Field[] fields = cls3.getDeclaredFields();
//获得所有成员变量
3.可以获得和使用对应类的成员方法
Method method = cls3.getMethod("eat");
Method method1 = cls3.getDeclaredMethod("eat");
Method[] methods = cls3.getDeclaredMethods();