Вопрос

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

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

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

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

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

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

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

... Отраженный вызов намного медленнее, чем прямой вызов. За прошедшие годы JVM очень хорошо справлялся с тем, чтобы быстро сделать размышления. Современные JVM на самом деле генерируют кучу кода за кулисами, чтобы избежать большей части старых старых JVM. Но простая правда заключается в том, что отраженный доступ через любое количество слоев всегда будет медленнее, чем прямой вызов, частично потому, что полностью генерированный метод «вызовы» должен проверять и перепроверить тип приемника, типы аргументов, видимость и другие детали, но Кроме того, потому что все аргументы должны быть объектами (поэтому примитивы получают объект) и должны быть предоставлены в качестве массива, чтобы покрыть все возможные архии (поэтому аргументы получают массив).

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

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

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

Это было полезно?

Решение

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

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

Еще один трюк, который делают методы, - это использует примитивный прямой (а не через обертки)

Метод -ручки могут быть быстрее, чем использование отражения, так как в JVM больше прямой поддержки, например, они могут быть вставлены. Он использует новую инструкцию Invokedynamic.

Другие советы

java.lang.reflect.Method относительно медленный и дорогой с точки зрения памяти. Предполагается, что ручки метода являются «легким» способом передачи указателей на функции, которые у JVM имеет шанс оптимизировать. Начиная с методом JDK8, не так хорошо оптимизированы, и Lambdas, вероятно, будут изначально реализованы с точки зрения классов (как это внутренние классы).

Думайте о методике как о современном, более гибком, более типовом способе размышления.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top