Я изучаю новые возможности 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.