1.6.2 使用原始类型进行动态调用
invoke 方法的第二个参数(动态调用方法的参数)为 Object,返回值(动态调用方法的返回值)也是 Object,实际工作中参数、返回值都可能是 原始类型。
若动态调用的方法的参数为原始类型,则需要将其用对应的 Wrapper 类包裹,然后传递给 invoke 方法作为第二个参数,invoke 在执行实际调用方法时,会自动 unwrap 参数,将实际的原始类型参数传递给方法。
若 invoke 调用的方法返回值为原始类型,则 invoke 将原始类型包装为对应 Wrapper 返回,比如若返回值为 int,则 invoke 调用返回值为 Integer,需要 手动 unwrap,
若返回值为 void,则 invoke 调用返回值为 null。
所以,若参数为原始类型,则需 手动包装,若返回值为原始类型,则需 手动解包装:
Method m = obj.class.getMethod("hashCode", null);
int code = ((Integer) m.invoke(obj, null)).intValue();
第一行通过自省获取 obj 中的 hashCode 方法,该方法无参数,返回值为 int,第二行通过 invoke 动态调用 hashCode 方法。
invoke调用结果为Object,将其cast为Integer类型,然后 解包装 获取int类型的返回值。