java中包装类的getclass()返回自身class对象(如integer.class),基本类型class只能通过int.class或integer.type获取,二者不等价但type与对应基本类型.class相等。

在 Java 中,包装类(如 Integer、Boolean 等)本身是引用类型,其 getClass() 返回的是包装类自身的 Class 对象(例如 Integer.class),而不是对应的基本类型(如 int.class)。要获取**基本类型**的 Class 对象,不能靠运行时反射,而应直接使用基本类型的 .class 字面量或通过包装类的静态字段。
使用基本类型字面量(最直接)
Java 为每个基本类型都提供了对应的 Class 对象字面量,这是编译期确定的,类型安全且高效:
-
int.class→Class<integer></integer>(注意:实际类型是Class<int></int>,但擦除后表现为Class) -
boolean.class→Class<boolean></boolean> -
double.class→Class<double></double> - 其他同理:
byte.class、short.class、long.class、float.class、char.class
通过包装类的 TYPE 静态字段(推荐用于泛型/动态场景)
每个包装类都定义了一个公共静态 final 字段 TYPE,其值就是对应基本类型的 Class 对象:
-
Integer.TYPE == int.class→true -
Boolean.TYPE == boolean.class→true -
Double.TYPE == double.class→true - 该字段在 JDK 1.1 就已存在,稳定可靠
不能用 getClass() 获取基本类型 Class
以下写法是错误的,得到的是包装类自身(引用类型)的 Class:
-
new Integer(1).getClass() == Integer.class(不是int.class) -
Boolean.TRUE.getClass() == Boolean.class(不是boolean.class) - 因为运行时对象必然是包装类实例,JVM 不会生成基本类型实例,所以无法通过实例反射出基本类型 Class
实用小技巧:根据包装类 Class 反查基本类型 Class
如果手头只有一个 Class> 对象(比如来自泛型擦除或配置),想判断它是否为某包装类,并取得对应基本类型 Class,可手动映射:
- 建立映射表(如
Map<class>, Class>></class>):将Integer.class → int.class、Character.class → char.class等一一对应 - 或用 if-else / switch(JDK 17+ 支持
switch匹配Class)判断后返回TYPE - 注意:没有通用反射 API 能自动完成这个转换,必须显式处理
不复杂但容易忽略:基本类型 Class 只能通过 .class 或 TYPE 获取,别试图从实例“推导”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











