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,将其 castInteger 类型,然后 解包装 获取 int 类型的返回值。

results matching ""

    No results matching ""