java中获取class对象有三种方式:一是通过实例调用getclass(),返回运行时真实类型;二是用class.forname("全限定名"),会触发类初始化;三是使用类字面量classname.class,最轻量且不触发初始化。

Java 中类的 Class 对象在运行期可通过三种标准方式动态获取,核心在于“谁持有类型信息”以及“是否已知类名或实例”。
通过对象实例调用 getClass()
已有某个类的实例时,最直接的方式是调用其 getClass() 方法。该方法返回该实例实际所属类的 Class 对象(注意:不是声明类型,而是运行时真实类型)。
- 适用于已创建对象、但需在运行时确认其具体类型的场景
- 支持多态:即使变量声明为父类或接口,
getClass()返回的仍是子类的Class - 示例:
String s = "hello"; Class> clazz = s.getClass(); // 返回 String.class
通过类名使用 Class.forName()
在运行期根据**全限定类名**(如 "java.util.ArrayList")加载并获取 Class 对象。该方法会触发类的初始化(即执行静态代码块和静态字段赋值)。
- 常用于配置驱动、插件机制、序列化框架等需要按名称动态加载类的场景
- 必须捕获
ClassNotFoundException - 示例:
Class> clazz = Class.forName("com.example.User");
通过类字面量(.class)获取
编译期已知类名时,可直接使用 ClassName.class 语法。这是最轻量、最安全的方式,不触发类初始化,也不抛出检查异常。
- 适用于编译期确定类型、且无需加载类的反射操作(如获取构造器、方法等)
- 泛型擦除后仍可获取原始类型:如
List.class,但不能写List<string>.class</string>(语法错误) - 示例:
Class<string> clazz = String.class;</string>
三者本质统一,都指向 JVM 中唯一的 Class 对象实例;选择哪种方式取决于上下文——有没有实例、是否知道类名、是否允许类初始化、是否在编译期可知类型。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











