java.lang.reflect 和 java.lang.invoke 有什么区别?



java.lang.reflect和java.lang.invoke之间有什么区别?

我知道我们两个都可以反思,但我不知道的区别

在我看来,reflect允许收集所有的方法、字段等,invoke可以调用一个没有对象的方法

阅读java文档链接可以帮助您清楚地理解差异。

java.lang.reflect

提供用于获取有关类和对象的反射信息的类和接口。

反射允许对有关加载类的字段、方法和构造函数的信息进行编程访问,并允许在安全限制范围内使用反射字段、方法或构造函数对其底层对应对象进行操作。

java.lang.invoke

java.lang.invoke包包含java核心类库和虚拟机直接提供的动态语言支持。

如Java虚拟机规范中所述,此包中的某些类型与虚拟机中的动态语言支持有特殊关系:

MethodHandle包含签名多态方法,无论其类型描述符如何,都可以链接这些方法。通常,方法链接需要类型描述符的精确匹配。

JVM字节码格式支持类MethodHandleMethodType的立即常量。

我推荐使用文档。引用第一句话:

java.lang.invoke包包含java核心类库和虚拟机直接提供的动态语言支持。

另一方面,java.lang.reflect是内省/反思。

reflect是一个较旧的库,invoke通过MethodHandles工作。

注意:不管名称如何,MethodHandle都可以包装构造函数或字段。

在Java 9中,会有VarHandles,尽管名称不限于变量,但它也可以调用代码。

相关内容

最新更新