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