Android MethodHandle反射性能优化
作者:互联网
安卓应用开发发展到今天,已经成为一个非常成熟的技术方向,从目前的情况看,安卓开发还是一个热火朝天的发展,但高级人才却相对较少,如今移动互联网的开发者也逐渐开始注重插入技术、性能优化、行业新技术、系统架构等方面的进步。
针对Android系统,有两个不同的开发方面:移植开发和上层应用程序开发。移动电话制造商从事移植开发工作,任何单位和个人都可以进行高层次的应用程序开发,其开发过程可以基于实际硬件系统,也可以基于模拟器环境。
本文介绍安卓开发中的MethodHandle反射性能优化。
关于指令调用。
不管是基于栈的JVM,还是基于寄存器的DVM,它们都遵循JSR规范,但不包括操作数栈中变量的移动和空间分配,也不包括程序计数器。
谈到MethodHandle之前,先谈一下Java动态缺陷。JAVA是一种偏向于静态的语言,它的动态一致性有许多限制:
l subject:前端编译(javac)时,泛型被擦除,泛型不能传递,泛型不支持值类型,而不支持动态泛型。
l 不支持动态方法替换。
l 不支持普通类的动态代理。
l 创建字节码的工具,API比较麻烦,等等。
l 将太多的活着的反射调用转换成大量的字节码。
MethodHandle主要解决以下问题:
(1)反射优化:MethodHandle是轻量级的直接调用字节码,而反射是重量级的,完全不能替代反射。
(2)动态方法调度,能够做到即使该方法被被子类重复,子类也能调用父类的方法。
(3)调用运行在JVM上的其他语言。
在JSR标准中,我们知道提供了四个方法调用指令。
l invokestatic:静态方法的调用(JIT将对这类指令进行内联优化,而不需要内联守护)
l invokevirtual:调用虚方法,通常指非私有的和final的方法(JIT会通过类层次结构分析(CHA)去虚化这些方法,进一步实现内联,这通常需要使用解释器进行保护,以防止陷阱出现时无法逃脱)
l invokespecial:构造方法和非虚方法的调用(JIT将对此指令进行内联优化,而不需要内联守护)
l Invokevirtual:访问接口方法的调用(JIT是否优化不取决于这种调用,而取决于他的实现
MethodHandle本质上是为调用JVM上的其他语言而设计的,它具有实际的方法分派功能(注意:JSR版本修改前,只能直接分派父类,可以任意分派)
以下是输出结果。
I love FatherI love Son
MethodHandle是怎样优化反射的?
前面的部分我们已经对JVM相关指令和MethodHandle所解决的问题进行了讨论,接下来我们将介绍一些重要API。
l MethodHandles.lookup() ;方法查询程序。
l MethodType.methodType(....);用于返回值、参数匹配、动态参数,第一个参数为从第二个参数开始的值类型。
l MethodHandle.bindTo(Object obj);绑定执行一个对象,当invoke还活着时,invokeExact参数将无法传送当前对象。
l MethodHanle.invoke(...) :一种方法是一个模糊参数类型,它的参数可能会传递给父类类型,当然代价就是这个方法的执行效率非常低。
l MethodHandle.invokeExact(...);参数类型方法必须与所调用的方法完全一致,如果String必须被String转换为String,则Object不能取代它,并根据需要进行类型转换,从而提高了方法的执行效率。
我们将LookupunreflectXXX与反射结合使用,因为MethodHandle不能完全替代反射,例如在不同包和类中调用私有方法,这需要通过反射,然后转换为MethodHandle。
如何优化MethodHandle的性能?
l MethodHandle静态化。
l 预期的bindTo指数表现将更好。
l 调用invokeExact
标签:反射,调用,方法,内联,MethodHandle,Android,优化 来源: https://blog.51cto.com/u_15127603/2725249