类名.class是Java中获取Class对象的编译期字面量语法,用于直接获取指定类、接口、枚举、注解或基本类型(如int.class)对应的唯一Class实例,无需对象、不抛异常、不触发类初始化,且类型安全、性能高。

在 Java 中,类名.class 是一种最直接、最常用的获取 Class 对象的静态方式,它在编译期就确定类型,无需实例、不触发类初始化(除非该类尚未加载),且性能高、线程安全。
什么是 类名.class?
这是 Java 提供的字面量语法,用于直接获取指定类(或接口、枚举、注解)对应的 Class 实例。它不是方法调用,也不是运行时反射,而是在编译时由 JVM 解析并生成的常量引用。
- 例如:
String.class返回java.lang.String的Class对象 - 支持基本类型:
int.class、void.class、boolean.class等也合法 - 支持数组类型:
String[].class、int[][].class
和其它获取 Class 的方式对比
区别于 obj.getClass() 和 Class.forName("全限定名"):
-
obj.getClass():必须有对象实例,返回其**实际运行时类型**(可能为子类),会触发该实例所属类的初始化 -
Class.forName("xxx"):通过字符串加载类,**会触发类的初始化**(执行 static 块),且可能抛出ClassNotFoundException -
类名.class:无需实例、无异常、不触发初始化(仅当类首次被主动使用时才初始化),编译期检查类型存在性
典型使用场景
适用于明确知道类型、且需在编译期绑定的场合:
立即学习“Java免费学习笔记(深入)”;
- 泛型擦除后保留类型信息:
new ArrayList<string>().getClass()</string>只能拿到ArrayList.class;但若你写String.class,就能精准表示元素类型 - JSON 序列化/反序列化(如 Gson):
gson.fromJson(json, Person.class) - 动态代理创建时指定接口:
Proxy.newProxyInstance(loader, new Class[]{List.class}, handler) - 注解处理器或框架配置中声明目标类型(如 Spring 的
@Bean方法返回类型推导)
注意事项
几个容易忽略但关键的细节:
- 不能用于泛型类型字面量:没有
List<string>.class</string>这种写法(因泛型擦除),只能用List.class - 对匿名内部类、局部类等无法使用(因为没“类名”),此时只能用
getClass() - 对于原始类型包装类,
Integer.class≠int.class,二者是不同的Class对象 - 该语法获取的是“类字面量”,JVM 保证同一类加载器下,同一个类的
类名.class表达式始终返回同一个Class实例


















