FTh*_*son 28 java reflection performance java-8 methodhandle
随着Java 7的发布MethodHandle,它允许用户像使用其底层字节码一样调用方法.特别是,MethodHandles.Lookup该类提供工厂方法来创建访问类成员的方法句柄:
Lookup对象上的工厂方法对应于方法,构造函数和字段的所有主要用例.工厂方法创建的每个方法句柄都是特定字节码行为的功能等价物.
从功能上讲,这或多或少等同于使用反射来访问这些相同的类成员,但方法句柄比反射更快.
那么,有什么理由仍然使用反射功能一样Field#get(..)/ Method.invoke(..)或这些方法是引进了更快的方法手柄的有效过时了吗?
请注意,尽管在Java 7中引入了方法句柄,但我的问题主要与Java 8有关,在Java 8中,它们被优化为可以达到与直接字段/方法调用大致相等的性能,超过了反射的能力.
Bri*_*etz 28
反射和方法句柄用于不同的目的,并存在于不同的抽象层次.您应该使用适合您正在解决的问题的那个.
反射是一种通用的内省机制,它包含方法处理机制所缺少的许多功能,例如枚举类的成员(Class.getMethods()),检查成员的特征,例如其可访问性标志,检查成员的通用签名等. .
另外,反射对象可以自由共享而不授予对sharee的访问权限,因为访问检查是在每次调用时进行的; 方法句柄赋予sharee调用的能力.所以他们也有不同的安全隐患.
方法句柄是用于查找,调整和调用方法的低级机制.虽然通过方法句柄调用比通过反射更快(虽然到目前为止,直接字节码调用通常仍然比方法句柄调用更快),但方法句柄也很难使用,因为它们不会自动执行Java用户期望的调整(例如将String参数转换为Object),从而导致链接错误.
反射库面向主流Java用户; 方法句柄层更多地针对编译器和语言运行时编写器.选择专为此工作设计的工具.
| 归档时间: |
|
| 查看次数: |
4093 次 |
| 最近记录: |