为什么在MethodHandle更快的情况下使用反射访问类成员?

23 浏览
0 Comments

为什么在MethodHandle更快的情况下使用反射访问类成员?

随着Java 7的发布,引入了MethodHandle,它允许用户像使用底层字节码一样调用方法。具体而言,MethodHandles.Lookup类提供了工厂方法来创建方法句柄以访问类成员:

Lookup对象上的工厂方法对应于方法、构造函数和字段的所有主要用例。由工厂方法创建的每个方法句柄在功能上等效于特定的字节码行为。

从功能上讲,这与使用反射访问相同的类成员基本等效,但方法句柄比反射更快。

那么,还有理由继续使用反射功能,例如Field#get(..)/Method.invoke(..),还是这些方法在更快的方法句柄引入后已经过时了呢?

需要注意的是,虽然方法句柄是在Java 7中引入的,但我的问题主要与Java 8有关,在这个版本中,它们被优化为达到与直接字段/方法调用大致相等的性能,超过了反射的能力。

0