Java MethodHandle api 似乎产生了不正确的类型
Java MethodHandle api seems to produce incorrect type
鉴于此代码:
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) {
}
方法 noOpRule
是 RulesEngine
class 的实例方法。
要在常规代码中调用它,您需要一个 RulesEnigne
对象以及一个 DomainObject
对象:
public static void callNoOpRule(RulesEngine rulesEngine, DomainObject domainObject) {
rulesEngine.noOpRule(domainObject);
}
要通过 MethodHandle
调用它,您还需要两个对象:
mh.invoke(rulesEngine, domainObject);
或者,如果您尝试从 RulesEngine
的实例方法中调用:
mh.invoke(this, domainObject);
鉴于此代码:
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) {
}
方法 noOpRule
是 RulesEngine
class 的实例方法。
要在常规代码中调用它,您需要一个 RulesEnigne
对象以及一个 DomainObject
对象:
public static void callNoOpRule(RulesEngine rulesEngine, DomainObject domainObject) {
rulesEngine.noOpRule(domainObject);
}
要通过 MethodHandle
调用它,您还需要两个对象:
mh.invoke(rulesEngine, domainObject);
或者,如果您尝试从 RulesEngine
的实例方法中调用:
mh.invoke(this, domainObject);