一、反射概念
反射,简单来说就是分析类信息的能力,类信息包括属性、方法、构造器等。
Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到类对象之后,再通过类对象进行反编译,从而获取对象的各种信息。
Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。
二、获取Class对象的三种方式
1.Class.forName("全类名"):将字节码文件加载进内存,返回class对象。
String className = "java.util .Random";
Class cl = Class.forName(className) ;
2.类名.class: 通过类名的class获取。
Gass cl2 = int.class;
3.对象.getClass() :getClass()方法在object类当中定义着。
Test t;
Class cl3 = t.getClass();
三、Class类中的分析类信息方法
Class类中的 getFields、 getMethods 和 getConstructors 方 法 将 分 别 返 回 类 提 供 的
public域、 方法和构造器数组,其中包括超类的公有成员。Class 类的 getDeclareFields、
getDeclareMethods 和 getDeclaredConstructors 方法将分别返回类中声明的全部域、 方法和构
造器, 其中包括私有和受保护成员,但不包括超类的成员。
/*通过反射获取Person类对象*/
Class aClass = Class.forName("com.qcby.reflect.Person");
Field[] fields = aClass.getDeclaredFields();
System.out.println("获取Person的所有属性对象");
for (Field field : fields) {
System.out.println(field);
}
System.out.println("获取Person的age属性对象");
Field age = aClass.getDeclaredField("age");
System.out.println(age);
System.out.println("-------------------------------------\n");
Constructor[] constructors = aClass.getDeclaredConstructors();
System.out.println("获取Person的所有构造方法");
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
System.out.println("获取Person的无参构造方法");
Constructor constructor = aClass.getDeclaredConstructor();
System.out.println(constructor);
System.out.println("获取Person的有参构造方法");
Constructor constructor1 = aClass.getDeclaredConstructor(String.class,Integer.class);
System.out.println(constructor1);
System.out.println("-------------------------------------\n");
Method[] declaredMethods = aClass.getDeclaredMethods();
System.out.println("获取Person的所有普通方法");
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod);
}
System.out.println("获取Person的getAge普通方法");
Method getAge = aClass.getDeclaredMethod("getAge");
System.out.println(getAge);
System.out.println("获取Person的setAge普通方法");
Method setAge = aClass.getDeclaredMethod("setAge",Integer.class);
System.out.println(setAge);
System.out.println("-------------------------------------\n");
System.out.println("获取Person的全类名");
System.out.println(aClass.getName());
System.out.println("获取Person的类名");
System.out.println(aClass.getSimpleName());