В чем разница между java.lang.reflect и java.lang.invoke?
Я знаю, что мы оба можем размышлять, но я не вижу разницы
На мой взгляд, отражение позволяет собирать все методы, поля и т. д., а вызов может вызывать метод без объекта.
В чем разница между java.lang.reflect и java.lang.invoke?
Я знаю, что мы оба можем размышлять, но я не вижу разницы
На мой взгляд, отражение позволяет собирать все методы, поля и т. д., а вызов может вызывать метод без объекта.
Я рекомендую документацию. Цитирую первое предложение:
Пакет java.lang.invoke содержит поддержку динамического языка, предоставляемую непосредственно основными библиотеками классов Java и виртуальной машиной.
java.lang.reflect, с другой стороны, является самоанализом/размышлением.
reflect
— более старая библиотека, а invoke
работает через MethodHandles.
Примечание: несмотря на название, MethodHandle может обернуть конструктор или поле.
В Java 9 будут VarHandles, которые, несмотря на название, не ограничивают переменные, но также могут вызывать код.
Чтение ссылок на документацию по Java поможет вам четко понять различия.
Предоставляет классы и интерфейсы для получения рефлексивной информации о классах и объектах.
Отражение обеспечивает программный доступ к информации о полях, методах и конструкторах загруженных классов, а также использование отраженных полей, методов и конструкторов для работы с их базовыми аналогами в пределах ограничений безопасности.
Пакет java.lang.invoke содержит поддержку динамического языка, предоставляемую непосредственно основными библиотеками классов Java и виртуальной машиной.
Как описано в Спецификации виртуальной машины Java, некоторые типы в этом пакете имеют особое отношение к поддержке динамического языка в виртуальной машине:
Класс MethodHandle
содержит сигнатурные полиморфные методы, которые могут быть связаны независимо от их дескриптора типа. Обычно для связывания методов требуется точное соответствие дескрипторов типов.
Формат байт-кода JVM поддерживает непосредственные константы классов MethodHandle
и MethodType
.