Подтвердить что ты не робот

MethodHandle - Что это такое?

Я изучаю новые возможности JDK 1.7, и я просто не могу понять, для чего предназначен MethodHandle. Я понимаю (прямой) вызов статического метода (и использование Core Reflection API, который в этом случае является простым). Я также понимаю (прямой) вызов виртуального метода (нестатического, не финального) (и использование API Core Reflection, требующего прохождения иерархии классов obj.getClass().getSuperclass()). Вызов не виртуального метода можно рассматривать как частный случай первого.

Да, я знаю, что есть проблема с перегрузкой. Если вы хотите вызвать метод, вы должны указать точную подпись. Вы не можете легко проверить перегруженный метод.

Но что такое MethodHandle? API Reflection позволяет вам "просматривать" внутренние объекты без каких-либо предварительных допущений (например, реализованный интерфейс). Вы можете осмотреть объект для какой-либо цели. Но что же такое MethodHandle? Почему и когда я должен использовать его?

ОБНОВЛЕНИЕ: Я читаю эту статью http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html. Согласно этому, главная цель - упростить жизнь для языков сценариев, которые работают поверх JVM, а не для самого языка Java.

UPDATE-2: Я заканчиваю читать ссылку выше, некоторые цитаты оттуда:

JVM станет лучшей виртуальной машиной для создания динамических языков, поскольку она уже является динамической виртуальной машиной. И InvokeDynamic, продвигая динамические языки для первоклассных граждан JVM, докажет это.

Использование методов отражения для вызова отлично работает... за исключением нескольких проблем. Объекты метода должны извлекаться из определенного типа и не могут быть созданы в общем виде. <... >

... отраженный вызов намного медленнее, чем прямой вызов. На протяжении многих лет JVM отлично справлялся с тем, чтобы сделать обратный вызов быстрым. Современные JVM на самом деле генерируют кучу кода за кулисами, чтобы избежать значительных проблем со старыми JVM. Но простая истина заключается в том, что отраженный доступ через любое количество уровней всегда будет медленнее прямого вызова, частично потому, что полностью генерализованный метод "invoke" должен проверять и повторно проверять тип приемника, типы аргументов, видимость и другие данные, но также потому, что аргументы должны быть объектами (поэтому примитивы получают объект-бокс) и должны быть представлены как массив для охвата всех возможных явлений (поэтому аргументы получают массив-boxed).

Разница в производительности может не иметь значения для библиотеки, выполняющей несколько отраженных вызовов, особенно если эти вызовы состоят в основном для динамической настройки статической структуры в памяти, с которой она может выполнять обычные вызовы. Но на динамическом языке, где каждый вызов должен использовать эти механизмы, это серьезный удар по производительности.

http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html

Итак, для Java-программиста это бесполезно. Я прав? С этой точки зрения, это можно рассматривать только как альтернативный способ для API Core Reflection.

4b9b3361

Ответ 1

Это предшественник Java 8, обеспечивающий языковую поддержку MethodHandles. Вы сможете напрямую обратиться к методу, и MethodHandles будут поддерживать это.

Что вы можете сделать с MethodHandles, это методы карри, изменить типы параметров и изменить их порядок.

Метод Ручки могут обрабатывать как методы, так и поля.

Другим трюком, который делает MethodHandles, является использование примитивных прямых (а не через обертки)

МетодHandles может быть быстрее, чем использование отражения, поскольку в JVM существует более прямая поддержка, например, они могут быть встроены. Он использует новую команду invokedynamic.

Ответ 2

java.lang.reflect.Method относительно медленный и дорогостоящий с точки зрения памяти. Обработчики методов должны быть "легким" способом прохождения вокруг указателей на функции, которые JVM имеет возможность оптимизировать. С точки зрения JDK8 методы обработки не очень хорошо оптимизированы, и lambdas, скорее всего, будут первоначально реализованы в терминах классов (как внутренние классы).

Ответ 3

Вспомните MethodHandle как современный, более гибкий, более типичный способ отражения.

В настоящее время он находится на ранних этапах своего жизненного цикла, но со временем может быть оптимизирован, чтобы стать обязанностью быстрее, чем рефлексия, до такой степени, что он может стать таким же быстрым, как обычный вызов метода.