Java MethodHandle api 似乎产生了不正确的类型

标签 java methodhandle

鉴于此代码:

MethodType mt = MethodType.methodType(void.class, DomainObject.class);
NOOP_METHOD = RULE_METHOD_LOOKUP.findVirtual(RulesEngine.class, "noOpRule", mt);

产生的NOOP_METHOD是

MethodHandle(RulesEngine,DomainObject)void 

为什么第一个参数在那里,当我调用它时会导致失败,例如

mh.invoke(domainObject);

错误消息是:

 java.lang.invoke.WrongMethodTypeException: cannot convert MethodHandle(RulesEngine,DomainObject)void to (DomainObject)void

这是有问题的方法:

public void noOpRule(DomainObject d) {
}

最佳答案

方法noOpRuleRulesEngine类的实例方法。

要在常规代码中调用它,您需要一个 RulesEnigne 对象以及一个 DomainObject 对象:

public static void callNoOpRule(RulesEngine rulesEngine, DomainObject domainObject) {
    rulesEngine.noOpRule(domainObject);
}

要通过 MethodHandle 调用它,您还需要这两个对象:

mh.invoke(rulesEngine, domainObject);

或者,如果您尝试从 RulesEngine 的实例方法调用:

mh.invoke(this, domainObject);

关于Java MethodHandle api 似乎产生了不正确的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51002385/

相关文章:

java - 从 ArrayList 中删除随机项

Java 子字符串如果为零则删除第一个字符

java - '@' 的转义字符——JDBC?

java - 使用 java MethodHandles 实现鸭子类型(duck typing)

java - 如何比较MethodHandle实例?

java - 如何在 ByteBuddy 中安装和使用常量 MethodHandle?

java - 防止重复但保留可逆重复插入顺序的集合?

java - 下拉菜单中的 i18n 使用 s :select tag

java - MethodHandles.filterArguments() 示例给出了异常

java - 缓存 MethodHandles.lookup() 的结果?