如何获取Class类的实例对象
首先我们要知道获取Class类的实例的方式一共有四种
- 这里我们会对这四种方式进行解析
注意: 我们获取到Class类的实例之后将这个实例赋给一个变量,这个变量名一定不能是class
- 也就是变量名不能是关键字
方式一: 调用运行时类的class属性
eg:
Class clazz1 = Person.class; //获取Person类对应的Class实例
System.out.println(clazz1); //这里输出的就是Person类的全类名
- 这里的Person类是一个自定义类
方式二: 通过运行时类的对象调用getClass()方法
eg:
Person p1 = new Person(); // 创建一个Person类的对象
Class clazz2 = p1.getClass(); //获取p1对象所在类对应的Class实例
System.out.println(clazz2); //这里输出的也是Person类的全类名
方式三: 调用Class类的静态方法 --> forName(String classPath)
eg:
/*
Class类的forName()方法的参数是Person类的全类名的字符串形式
*/
Class clazz3 = Class.forName("com.atguigu.java.Person");
System.out.println(clazz3); // 这里输出的也就是Person类的全类名,也即是forName()方法的实参
方式四: 使用类加载器: ClassLoader
eg:
package 反射.获取Class类的实例;
public class ReflectionDemo1 {
public static void main(String[] args) throws ClassNotFoundException{
/*
通过ReflectionDemo运行时类对应的Class实例,调用Class类中的getClassLoader()方法
获取到了一个类加载器对象
注意: 这里的ReflectionDemo1类使我们的自定义类,所以这里获取到的就是一个系统类加载器
*/
ClassLoader classLoader = ReflectionDemo1.class.getClassLoader();
/*
通过类加载器对象调用其中的loadClass()方法来主动地将一个类从硬盘中加载到内存中
我们需要在这个类中输入这个要加载的类的全类名就可以
注意: 这个方法会声明一个java.lang.ClassNotFoundException
*/
Class clazz4 = classLoader.loadClass("com.atguigu.java.Person");
/*
这里输出的结果就是我们loadClass()方法的实参
*/
System.out.println(clazz4);
}
}
最后我们如果对获得的四个Class类的实例进行判断地址,也就是
System.out.println(clazz1 == clazz2);
System.out.println(clazz1 == clazz3);
System.out.println(clazz1 == clazz4);
这个时候我们会发现三个输出结果都为: true
- 前提是我们都是一个Person类的Class实例
总结: 也就是一个运行时类只对应了一个唯一存在的Class类的实例
总结:
- 我们在实际编程中最常用的创建Class类的实例的方式是第三种方式
- 通过第三种方式,也就是通过调用Class类的静态方法forName(String classPath)的方式来获取Class类的实例能更好的体现"java语言的准动态性"
- 因为使用这种第三种方式的时候我们可以通过变量控制参数,来达到编译期间不直接确定获取哪个运行时类对应的Class类的对象,等到运行期间才确定到底是要获取哪个运行时类对应的Class类的对象
- 如果是编译期间就确定了的 — 我们就称之为"静态的"
- 如果是编译期间不确定,等到运行期间才确定 — 我们就称之为"动态的"
- 因为使用这种第三种方式的时候我们可以通过变量控制参数,来达到编译期间不直接确定获取哪个运行时类对应的Class类的对象,等到运行期间才确定到底是要获取哪个运行时类对应的Class类的对象
- 通过第三种方式,也就是通过调用Class类的静态方法forName(String classPath)的方式来获取Class类的实例能更好的体现"java语言的准动态性"