当 MethodHandle 速度较快时,为什么要使用反射来访问类成员?
随着Java 7的发布,MethodHandle
出现了,它允许用户调用一个方法,就好像使用其底层字节码一样。特别是,MethodHandles.Lookup
类提供了工厂方法来创建方法句柄来访问类成员:
Lookup 对象上的工厂方法对应于方法、构造函数和字段的所有主要用例。由工厂方法创建的每个方法句柄都是特定字节码行为的功能等效项。
从功能上讲,这或多或少等同于使用反射来访问这些相同的类成员,但方法句柄比反射更快。
那么,有什么理由仍然使用像Field#get(..)
这样的反射功能吗?/Method.invoke(..)
或者这些方法是否随着引入更快的方法句柄而有效地过时了?
请注意,虽然方法句柄是在Java 7中引入的,但我的问题主要与Java 8有关,其中它们经过优化,被认为达到了与直接字段/方法调用大致相等的性能,超出了反射的能力。