【Java 18】使用方法句柄重新实现核心反射功能
反射 API 在 Java 应用的开发中比较常用。核心反射 API 指的是 java.lang.reflect
包中的 Method
、Constructor
和 Field
类。从 Java 7 之后,对于反射操作,Java 中一共有 3 种不同的内部实现方式。
- 第一种是虚拟机提供的原生方法。在虚拟机启动时使用,可以提高性能。
- 第二种是
Method
和Constructor
使用的动态生成的字节代码,以及Field
使用的Unsafe
API。 - 第三种是方法句柄。
这 3 种不同的实现方式带来了维护上的麻烦。在 Java 18 中,第二种方式被方法句柄替代。虚拟机提供的原生方法,只在虚拟机启动的早期阶段使用。等方法句柄机制完成初始化之后,反射操作的内部实现会完全基于方法句柄。这个改动只针对内部实现,并没有改变反射 API 的语法。
这里需要着重注意的是内部实现改动所带来的性能影响。为了达到最佳的性能,Method
、Constructor
和 Field
的实例,都应该保存在 static final
的字段中。在这种情况下,新的实现可以带来 43% 到 57% 的性能提升。反过来,如果这些实例不是保存在常量字段中,性能会有所下降。尤其是 Field
访问的性能会降低 51% 到 77%。这样的性能降低在实际的应用中,可能并不是一个问题,但是仍然需要引起注意。
总得来说,在 Java 18 中,只需要记得把 Method
、Constructor
和 Field
的实例,保存在 static final
的字段中即可。