反射是在java框架中经常接触到的一种方法,所谓的反射,及时给你一个xxx.class文件,通过反射方法, 能够拿到改xxx类相关的所有资源。
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中
1、Class类:代表一个类。
2、Field 类:代表类的成员变量(成员变量也称为类的属性)。
3、Method类:代表类的方法。
4、Constructor 类:代表类的构造方法。
5、Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
一、获取class对象的三种常用方法:
1、通过完整的包名.类名获取对应的class类对象
Class Class.forName(String packageNameAndClassName) throws ClassNotFoundException;
2、通过类名获取当前类对象对应的class类对象
Class 类对象.getClass();
例如:Person p = new Person();
p.getClass() ⇒ Person 类对应的Class对象
3、通过类名获取
Class 类名.class;
例如:Person.class ⇒ Person 类对应的Class对象
public class GetClassObject {
public static void main(String[] args) throws ClassNotFoundException {
//1、Class Class.forName(String packageNameAndClassName) throws ClassNotFoundException;
Class cls1 = Class.forName("Person");
//2、Class 类对象.getClass();
Person person = new Person();
Class cls2 = person.getClass();
//3、Class 类名.class
Class cls3 = Person.class;
System.out.println(cls3);
System.out.println("cls1 == cls2 : " + (cls1 == cls2));
System.out.println("cls2 == cls3 : " + (cls2 == cls3));
System.out.println("cls3 == cls1 : " + (cls3 == cls1));
}
}
!
总结:不管是通过哪一种方式获取指定类的class对象,都是同一个class对象,因为当前Person类在当前程序中有且只占用一次代码区空间。
二、操作Constructor构造方法类:
1、通过class类对象获取对应的Constructor构造方法类对象:
1.1 获取当前class对象对应的类中所有非私有化构造方法类对象数组。
constructor[] getConstructors();
//1、获取当前Class对象对应的类中的所有非私有化构造方法对象数组
Constructor[] constructors = cls.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
1.2 暴力获取所有构造方法类对象数组,包括私有化构造方法。
Constructors[] getDeclaredConstructors();
//2、暴力获取所有的构造方法类对象数组(包括私有化)
Constructor[] declaredConstructors = cls.getDeclaredConstructors();
for (Constructor constructor : declaredConstructors) {
System.out.println(constructor);
}
1.3 根据指定的参数类型获取构造方法(非私有化)
Constructor getConstructor(Class... parameterTypes);
例如:
无参构造:cls.getConstructor();
两个参数构造方法:cls.getConstructor(int.class, String.class)
Class… parameterTypes :Class类型不定长参数,用于约束当前构造方法数据类型
Constructor constructor1 = cls.getConstructor();
Constructor constructor2 = cls.getConstructor(int.class);
Constructor constructor3 = cls.getConstructor(int.class, String.class);
System.out.println(constructor1);
System.out.println(constructor2);
System.out.println(constructor3);
1.4 暴力获取指定数据类型的构造方法(包括私有化)
Constructor getDeclaredConstructor(Class... parameterTypes);
例如:获取私有化String类型的构造方法:
cls.getDeclearedConstructor(String.class);
Constructor constructor4 = cls.getDeclaredConstructor(String.class);
System.out.println(constructor4);
2、操作Constructor类对象创建对应类对象
2.1 通过Constructor类对象,执行对应的构造方法,创建对应的类对象
Object newInstance(Object... parameters);
例如:
Person();无参构造
Person p1 = (Person) constructor.newInstance();
Person(int, java.lang.String);
Person p2 = (Person)constructor.newInstance(10,"小明");
//5、newInstance 创建类对象
Person p1 = (Person) constructor1.newInstance();
Person p2 = (Person) constructor2.newInstance(10);
System.out.println(p1);
System.out.println(p2);