您的位置:首页 > 编程语言 > Java开发

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 }

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: