Как сравнить два экземпляра MethodHandle
? Я ожидаю, что функция вернет true, если дескрипторы указывают на тот же метод. Это не похоже на переопределение класса equals()
или hashcode()
. Безопасно ли использовать оператор равенства (==
)?Как сравнить экземпляры MethodHandle?
ответ
Прежде всего, MethodHandle
s может не только инкапсулировать целевой метод, но и поведение . Например. у вас могут быть два метода, указывающие на один и тот же метод, но один инкапсулирующий не виртуальный (super. …
) вызов, а другой - обычный виртуальный вызов. Эти ручки не могут быть равны.
Кроме того, нет никакого определенного равенства для MethodHandle
s в любом случае. Они там, чтобы позволить призывание но не самоанализ:
JVMSpec §5.4.3.5. Method Type and Method Handle Resolution:
Реализация виртуальной машины Java не требуется стажер типов метод или метод обрабатывает. То есть две различные символические ссылки на типы методов или дескрипторы методов, которые являются структурно идентичными, могут не разрешаться для одного и того же экземпляра
java.lang.invoke.MethodType
илиjava.lang.invoke.MethodHandle
соответственно.
Однако, начиная с Java 8 есть функция, которая позволяет вникать прямойMethodHandle
, Lookup.revealDirect
. Для дескрипторов, для которых эта операция завершается успешно, вы можете использовать информацию в возвращаемом MethodHandleInfo
, чтобы узнать, указывают ли две ручки одному и тому же методу.
- 1. Как сравнить экземпляры HMAccessory
- 2. Как сравнить экземпляры типа равенства
- 3. Tcl: Сравнить экземпляры класса
- 4. Java MethodHandle
- 5. MethodHandle - В чем дело?
- 6. сравнить экземпляры типа шаблона и конкретного типа
- 7. Невозможно сравнить Углеродные экземпляры в Laravel 5?
- 8. Как изменить аргументы MethodHandle после вставки?
- 9. Есть ли простой способ сравнить экземпляры BufferedImage?
- 10. Как сравнить экземпляры фантомного типа относительно аргумента фантомного типа?
- 11. как сравнить два списка, экземпляры объектов в Python
- 12. Java MethodHandle; используйте параметр в нескольких местах
- 13. MethodHandle пример бросает WrongMethodTypeException на invokeExact вызова
- 14. Можно ли преобразовать ссылку метода на MethodHandle?
- 15. Как сравнить экземпляры, объявленные как id <protocol> в Objective-C
- 16. Как отслеживать экземпляры классов?
- 17. Как отличить экземпляры класса?
- 18. Как остановить экземпляры SimpleMessageListenerContainer?
- 19. Oracle, Пользователи как экземпляры
- 20. Как инициализировать экземпляры классов?
- 21. Как создать экземпляры StandaloneDeriving
- 22. Как перебирать экземпляры класса
- 23. Как работают экземпляры сервлета?
- 24. Как собрать экземпляры XMLHttpRequest?
- 25. Сравните два RouteValueDictionary экземпляры
- 26. Может ли MethodHandle использоваться каркасами/библиотеками (вместо традиционного отражения)?
- 27. Код Java для компиляции в MethodHandle в Constant Pool
- 28. Нахождение наиболее конкретный перегруженный метод с использованием MethodHandle
- 29. Convert MethodHandle для ссылки на метод (здесь Функция)
- 30. java/lang/noClassDefFoundError: java/lang/invoke/MethodHandle eclipse juno
Из любопытства вы можете привести пример непрямого 'MethodHandle' и как он построен? – Gili
Большинство дескрипторов, возвращаемых фабричными методами в ['MethodHandles'] (http://docs.oracle.com/javase/8/docs/api/java/lang/invoke/MethodHandles.html), являются непрямым методом ручки. Проще говоря, дескрипторы, которые непосредственно не нацелены на метод, конструктор или поле, а скорее изменяют поведение другого дескриптора, являются непрямыми ручками. Но также [постоянная обертка] (http://docs.oracle.com/javase/8/docs/api/java/lang/invoke/MethodHandles.html#constant-java.lang.Class-java.lang.Object-), который не модифицирует другой дескриптор (но не имеет конкретного целевого метода), не является прямым. – Holger