Преобразовать BoundMethodHandle в отражение - PullRequest
0 голосов
/ 07 сентября 2018

Возможно ли получить элемент, на который ссылается метод MethodHandle?

MethodHandle mh = MethodHandles.lookup().findStatic(..., ..., ...);
java.lang.reflect.Method method = convertToReflection(mn); //???

1 Ответ

0 голосов
/ 07 сентября 2018

Правильный термин - «дескриптор прямого метода», чтобы подчеркнуть тот факт, что существует прямая связь с членом класса. Или, как написано в документации :

A дескриптор прямого метода представляет метод, конструктор или поле без каких-либо промежуточных привязок аргументов или других преобразований.

Термин «связанный» скорее предполагает, что существуют предварительно связанные значения параметров или связанный получатель, которые больше не будут соответствовать простому объекту Reflection.

Java 8 позволяет получить член из MethodHandle через MethodHandles.Lookup.revealDirect(…):

public class Tmp {
    public static void main(String[] args) throws ReflectiveOperationException {
        MethodHandles.Lookup lookup = MethodHandles.lookup();
        MethodHandle mh = lookup
          .findStatic(Tmp.class, "main", MethodType.methodType(void.class, String[].class));
        Method method = lookup.revealDirect(mh).reflectAs(Method.class, lookup);
        System.out.println(method);
    }
}

Он ограничен объектами Reflection, совместимыми с контекстом, описанным предоставленным вами объектом Lookup, т. Е. Он будет работать, когда попытка поиска того же члена по имени и типу будет успешной с этим объектом поиска.

...