Java MethodHandle API似乎产生了错误的类型

时间:2018-06-23 15:01:19

标签: 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) {
}

1 个答案:

答案 0 :(得分:2)

方法noOpRuleRulesEngine类的实例方法。

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

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

要通过MethodHandle进行调用,您还需要两个对象:

mh.invoke(rulesEngine, domainObject);

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

mh.invoke(this, domainObject);