Java中获取原始类型Class对象的标准方式是使用包装类的TYPE字段(如Integer.TYPE)或原始类型字面量.class(如int.class),二者等价且指向同一Class实例,不可通过getClass()或Class.forName()获取。

原生类型(如 int、boolean)本身不是类,没有 Class 对象;但 Java 为它们提供了对应的包装类(Integer、Boolean),并内置了特殊的 TYPE 字段来暴露其原始类型的 Class 实例。
包装类的 TYPE 字段是关键入口
每个原始类型的包装类(Integer、Character、Double 等)都定义了一个静态常量 TYPE,它直接引用对应原始类型的 Class 对象。这是 JVM 规范强制要求的,也是最标准、最推荐的方式。
-
Integer.TYPE返回int.class -
Boolean.TYPE返回boolean.class -
void.class等价于Void.TYPE(注意:Void 是占位符类,不可实例化)
原始类型字面量可直接获取 Class
Java 允许对原始类型使用 .class 语法,例如 int.class、double.class。这种写法在编译期被 JVM 直接解析为对应的原始类型 Class 实例,底层与 包装类.TYPE 指向同一对象。
-
int.class == Integer.TYPE→true -
boolean.class == Boolean.TYPE→true - 该方式简洁直观,适合在泛型边界、反射判断或注解处理器中使用
不能通过 new 或 getClass() 获取原始类型的 Class
原始类型不是对象,无法调用方法,也不能用 new 创建实例,因此以下方式均无效:
-
int i = 0; i.getClass();→ 编译错误(int没有方法) -
new int();→ 编译错误(原始类型不可实例化) -
Class.forName("int")→ 抛出ClassNotFoundException(JVM 不识别原始类型字符串名)
区分包装类 Class 和原始类型 Class
容易混淆的是:Integer.class 和 int.class 是两个完全不同的 Class 对象:
-
Integer.class描述的是包装类类型,属于引用类型,可为null,参与泛型擦除 -
int.class描述的是原始类型,是 JVM 内建的特殊类型,不继承自Object,不参与多态分派 - 反射中判断字段类型时:
Field.getType()对int f;返回int.class,对Integer f;返回Integer.class
理解 TYPE 字段和 .class 语法的本质一致性,是准确操作原始类型反射行为的基础。不需要绕路、无需装箱,直接用标准机制即可安全获取。










