0
点赞
收藏
分享

微信扫一扫

如果获取Class类的实例对象 [Java]

如何获取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类的实例

总结:

  1. 我们在实际编程中最常用的创建Class类的实例的方式是第三种方式
    • 通过第三种方式,也就是通过调用Class类的静态方法forName(String classPath)的方式来获取Class类的实例能更好的体现"java语言的准动态性"
      • 因为使用这种第三种方式的时候我们可以通过变量控制参数,来达到编译期间不直接确定获取哪个运行时类对应的Class类的对象,等到运行期间才确定到底是要获取哪个运行时类对应的Class类的对象
        • 如果是编译期间就确定了的 — 我们就称之为"静态的"
        • 如果是编译期间不确定,等到运行期间才确定 — 我们就称之为"动态的"
举报

相关推荐

0 条评论