Java MethodHandle API, кажется, производит неправильный тип - PullRequest
0 голосов
/ 23 июня 2018

Учитывая этот код:

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 голосов
/ 23 июня 2018

Метод noOpRule является методом экземпляра класса RulesEngine.

Чтобы вызвать его в обычном коде, вам нужен объект RulesEnigne, а также объект DomainObject:

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

Чтобы вызвать его через MethodHandle, вам также понадобятся оба объекта:

mh.invoke(rulesEngine, domainObject);

или, если вы пытаетесь вызвать из метода экземпляра RulesEngine:

mh.invoke(this, domainObject);
...