反射调用方法返回值为object,基本类型会自动装箱为包装类(如int→integer),void返回null;安全获取需先instanceof判型再xxxvalue()取值,避免强转异常。

反射调用方法后,获取返回值时需特别注意基本类型(如 int、boolean)和对应包装类型(如 Integer、Boolean)之间的差异——Java 会自动完成拆箱(Integer → int)或装箱(int → Integer),但反射本身不参与该过程,返回的是实际运行时的原始对象。
方法返回值的实际类型由声明决定
反射中 Method.invoke() 总是返回 Object 类型。若方法声明返回 int,JVM 在调用后会自动装箱为 Integer,所以 invoke() 实际返回的是 Integer 对象;若声明返回 Integer,则直接返回该对象,无需额外装箱。
- 返回
int→invoke()返回Integer(自动装箱) - 返回
Integer→invoke()返回Integer(无变化) - 返回
void→invoke()返回null
安全获取基本类型值:优先用包装类判断 + 显式转型
不要直接强转 (int) obj,容易抛 ClassCastException。应先检查实际类型,再调用对应包装类的 xxxValue() 方法:
if (result instanceof Integer) intValue = ((Integer) result).intValue();if (result instanceof Boolean) boolValue = ((Boolean) result).booleanValue();- 对
null(如 void 方法或返回 null 的包装类型)需单独判空,避免NullPointerException
泛型与类型擦除带来的限制
即使方法签名是 <t> T getValue()</t>,反射也无法获知运行时的 T 具体类型。返回值仍是原始对象(如 Integer 或 String),不能依赖泛型信息做自动转换。需要业务层约定或额外传入 Type 信息辅助解析。
实用建议:封装一个安全的反射取值工具方法
可按需扩展支持常见类型转换,例如:
- 输入
result和期望的目标类型(int.class或Integer.class) - 内部判断是否为
null、是否为对应包装类、是否为子类(如Long转int需截断提示) - 对基本类型,统一用包装类的
xxxValue()获取;对引用类型,直接instanceof校验后转型










