В чем разница между java.lang.reflect и java.lang.invoke?

В чем разница между java.lang.reflect и java.lang.invoke?

Я знаю, что мы оба можем размышлять, но я не вижу разницы

На мой взгляд, отражение позволяет собирать все методы, поля и т. д., а вызов может вызывать метод без объекта.


person Sabreveur    schedule 10.01.2016    source источник


Ответы (3)


Я рекомендую документацию. Цитирую первое предложение:

Пакет java.lang.invoke содержит поддержку динамического языка, предоставляемую непосредственно основными библиотеками классов Java и виртуальной машиной.

java.lang.reflect, с другой стороны, является самоанализом/размышлением.

person bmargulies    schedule 10.01.2016

reflect — более старая библиотека, а invoke работает через MethodHandles.

Примечание: несмотря на название, MethodHandle может обернуть конструктор или поле.

В Java 9 будут VarHandles, которые, несмотря на название, не ограничивают переменные, но также могут вызывать код.

person Peter Lawrey    schedule 10.01.2016

Чтение ссылок на документацию по Java поможет вам четко понять различия.

java.lang.reflect

Предоставляет классы и интерфейсы для получения рефлексивной информации о классах и объектах.

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

java.lang.invoke

Пакет java.lang.invoke содержит поддержку динамического языка, предоставляемую непосредственно основными библиотеками классов Java и виртуальной машиной.

Как описано в Спецификации виртуальной машины Java, некоторые типы в этом пакете имеют особое отношение к поддержке динамического языка в виртуальной машине:

Класс MethodHandle содержит сигнатурные полиморфные методы, которые могут быть связаны независимо от их дескриптора типа. Обычно для связывания методов требуется точное соответствие дескрипторов типов.

Формат байт-кода JVM поддерживает непосредственные константы классов MethodHandle и MethodType.

person Ravindra babu    schedule 11.01.2016