ReflectASM-invoke,高效率java反射机制原理
2018-03-28 13:53
621 查看
前言:前段时间在设计公司基于netty的易用框架时,很多地方都用到了反射机制。反射的性能一直是大家有目共睹的诟病,相比于直接调用速度上差了很多。但是在很多地方,作为未知通用判断的时候,不得不调用反射类型来保障代码的复用性和框架的扩展性。所以我们只能想办法优化反射,而不能抵制反射,那么优化方案,这里给大家推荐了ReflectASM。
一、性能对比
我们先通过简单的代码来看看,各种调用方式之间的性能差距。
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.com/jad.html // Decompiler options: packimports(3) package com.johhny.ra; import com.esotericsoftware.reflectasm.MethodAccess; // Referenced classes of package com.johhny.ra: // User public class UserMethodAccess extends MethodAccess { public UserMethodAccess() { } /** * 这个方法是主要是实现了MethodAccess 的抽象方法,来实现反射的功能 * @param obj 需要反射的对象 * @param i class.getDeclaredMethods 对应方法的index * @param 参数对象集合 * @return */ public transient Object invoke(Object obj, int i, Object aobj[]) { User user = (User)obj; switch(i) { case 0: // '\0' return user.getName(); case 1: // '\001' return Integer.valueOf(user.getId()); case 2: // '\002' user.setName((String)aobj[0]); return null; case 3: // '\003' user.setId(((Integer)aobj[0]).intValue()); return null; } throw new IllegalArgumentException((new StringBuilder("Method not found: ")).append(i).toString()); } }View Code
由代码可以看出来,实际上ReflectASM就是把类的各个方法缓存起来,然后通过case选择,直接调用,因此速度会快上很多。但是它的get方法同样会消耗很大的时间,因此就算是使用ReflectASM的朋友也记得请在启动的时候就初始化get方法计入缓存。
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 }
相关文章推荐
- Invoke()/BeginInvoke()区别
- c#编程指南(十三) 平台调用P-INVOKE完全掌握, 结构体和结构体指针
- 巧用On Field Update Invoke,和Named Method
- JspFragement的invoke方法理解
- python invoke C program
- php 高效率写法 推荐
- Thread,Invoke
- Mozilla UI中书写高效率CSS
- java中的反射机制中invoke典型用法
- 《编程之美》1.9:高效率的安排见面会的一个解法
- [ZZ]C# Invoke和BeginInvoke 区别
- Excel/Word 插入图表 InvokeMember设置图表类型
- 关于Control.Invoke与Control.BeginInvoke
- Control的Invoke和BeginInvoke
- WCF WebGet WebInvoke WCF Jquery 调用
- InvocationHandler的invoke方法如何被调用?
- java invoke 1【动态调用类的方法】
- Debian与RH的service命令作用等同的命令为invoke-rc.d
- 高效率Oracle SQL语句
- java反射中Method类invoke方法的用法