其他分享
首页 > 其他分享> > Android MethodHandle反射性能优化

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版本修改前,只能直接分派父类,可以任意分派)

8.1.png 

8.2.png 

 

以下是输出结果。

 

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