Java反射中区分基本类型与包装类:int.class与Integer.class是不同Class实例,应通过isPrimitive()判断;基本类型用字面量或TYPE字段获取Class,包装类用类名或forName;instanceof不适用基本类型,反射调用需严格匹配参数Class类型。

Java 反射中识别基本类型和包装类,关键在于区分它们的 Class 对象来源与语义本质——int.class 和 Integer.class 是两个完全独立的 Class 实例,不能用 == 或 equals 混淆判断。
看 Class 对象是否来自基本类型
基本类型(如 int、boolean)没有真实类定义,但 JVM 预置了对应的 Class 对象。可通过以下方式确认:
- 用 类型字面量 获取:int.class、boolean.class、void.class
- 用 包装类的 TYPE 字段 获取等价引用:Integer.TYPE == int.class,Boolean.TYPE == boolean.class
- 调用 Class.isPrimitive() 返回 true —— 这是最可靠、最通用的判断方式
看 Class 对象是否来自包装类
包装类(如 Integer、Boolean)是标准的引用类型,其 Class 对象由类加载器加载,具备完整类结构:
- 直接使用类名获取:Integer.class、Character.class
- 通过 Class.forName("java.lang.Double") 动态加载
- 调用 Class.isPrimitive() 返回 false,且 Class.isAssignableFrom(Number.class) 对多数数值包装类返回 true(Boolean 除外)
运行时对象类型识别要避开 instanceof 陷阱
instanceof 只能用于引用类型,对基本类型变量直接使用会编译失败。正确做法是:
立即学习“Java免费学习笔记(深入)”;
- 确保待判断的是对象(如 Byte b = 10;),再用 b instanceof Byte
- 若不确定是否为 null,优先用 obj.getClass() == Byte.class(需先判空)或 Byte.class.isInstance(obj)(自动处理 null,返回 false)
- 对泛型擦除后的 Object 参数,结合 isPrimitive() 和包装类枚举判断更稳妥
实际反射调用时注意参数类型匹配
方法反射调用(如 Method.invoke)必须传入与声明类型一致的参数 Class:
- 目标方法签名是 void test(int x),则 getMethod("test", int.class),不是 Integer.class
- 传参时可传 int 值(自动装箱),但反射查找方法时必须用基本类型的 Class 对象
- 若误用 Integer.class 查找,会抛出 NoSuchMethodException


















