什么是Class对象?
Class对象描述类的信息,对应着java.lang.Class类。类是对象的抽象,而Class类是对类信息的抽象。
为什么需要Class对象?
1、当程序在运行时需要识别对象和类的信息时,就会需要用到Class对象中的信息。即RTTI(Run-Time Type Identification)运行时类型识别 ,是依赖Class对象来完成功能。java语言的多态性就是基于RTTI实现的。可见,Class对象非常重要!!
2、java的反射机制也要依赖Class对象来实现。(动态代理的实现依赖的是反射机制)
反射机制:即动态的获取类和对象的信息以及动态调用类和对象的方法的功能。反射机制需要在运行时识别类和对象的信息,和RTTI不同的是,反射机制需要程序管理Class对象,而RTTI不需要(由JVM管理)。反射机制和RTTI的本质是一样的,都是在运行时识别类和对象的信息。
3、由1和2可知,在生成任何java对象(除了Class对象)之前,必须要先在内存中生成对应的Class对象供给程序使用。
如何获取Class对象?(4种方式)
1、Class.forName("类的全限定名");
2、对象.getClass();
3、类.class;
4、ClassLoader.loadClass(String)
说明:调用Class.forName()会执行静态初始化等初始化工作,而类.class则不会。此外,ClassLoader.loadClass(String)也是仅仅加载类,不执行类初始化;可以通过Class.forName(String, boolean, ClassLoader)第二个参数来仅仅加载类不执行初始化;
Class对象和类是一一对应的吗?
不是。不同的加载器(ClassLoader)加载同一个类(同一个.class文件),获得的Class对象是不相同的。但是,加载器的实现原理使用的是委派机制,这样确保了同一个类只会被一个加载器所加载。除非故意而为之,否则jvm缓存中某个类对应的Class对象是唯一的。
关于类的加载,参考:https://blog.csdn.net/m0_38075425/article/details/81627349
关于Class对象的详解,参考:https://blog.csdn.net/mcryeasy/article/details/52344729
觉得有用的老铁赞一下呗!