【Java 18】使用方法句柄重新实现核心反射功能

反射 API 在 Java 应用的开发中比较常用。核心反射 API 指的是 java.lang.reflect 包中的 MethodConstructorField 类。从 Java 7 之后,对于反射操作,Java 中一共有 3 种不同的内部实现方式。

  • 第一种是虚拟机提供的原生方法。在虚拟机启动时使用,可以提高性能。
  • 第二种是 MethodConstructor 使用的动态生成的字节代码,以及 Field 使用的 Unsafe API。
  • 第三种是方法句柄。

这 3 种不同的实现方式带来了维护上的麻烦。在 Java 18 中,第二种方式被方法句柄替代。虚拟机提供的原生方法,只在虚拟机启动的早期阶段使用。等方法句柄机制完成初始化之后,反射操作的内部实现会完全基于方法句柄。这个改动只针对内部实现,并没有改变反射 API 的语法。

这里需要着重注意的是内部实现改动所带来的性能影响。为了达到最佳的性能,MethodConstructorField 的实例,都应该保存在 static final 的字段中。在这种情况下,新的实现可以带来 43% 到 57% 的性能提升。反过来,如果这些实例不是保存在常量字段中,性能会有所下降。尤其是 Field 访问的性能会降低 51% 到 77%。这样的性能降低在实际的应用中,可能并不是一个问题,但是仍然需要引起注意。

总得来说,在 Java 18 中,只需要记得把 MethodConstructorField 的实例,保存在 static final 的字段中即可。

版权所有 © 2024 灵动代码