`
stephen830
  • 浏览: 2969276 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ReflectASM,高性能的反射

    博客分类:
  • java
 
阅读更多

 

http://www.oschina.net/p/reflectasm

 

ReflectASM 是一个非常小的 Java 类库,通过代码生成来提供高性能的反射处理,自动为 get/set 字段提供访问类,访问类使用字节码操作而不是 Java 的反射技术,因此非常快。

性能比较:

 

什么是ReflectASM    ReflectASM是一个很小的java类库,主要是通过asm生产类来实现java反射,执行速度非常快,看了网上很多和反射的对比,觉得ReflectASM比较神奇,很想知道其原理,下面介绍下如何使用及原理。

如何使用

public class User {  
    private int id;  
    private String name;  
  
    public int getId() {  
        return id;  
    }  
  
    public void setId(int id) {  
        this.id = id;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
}  
  
  
  
public class ReflectAsmTest {  
    public static void main(String[] args) {  
        User user = new User();  
        //使用reflectasm生产User访问类  
        MethodAccess access = MethodAccess.get(User.class);  
        //invoke setName方法name值  
        access.invoke(user, "setName", "张三");  
        //invoke getName方法 获得值  
        String name = (String)access.invoke(user, "getName", null);  
        System.out.println(name);  
    }  
} 

 

输出:
张三

原理
   上面代码的确实现反射的功能,代码主要的核心是 MethodAccess.get(User.class);
看了下源码,这段代码主要是通过asm生产一个User的处理类 UserMethodAccess(这个类主要是实现了invoke方法)的ByteCode,然后获得该对象,通过上面的invoke操作user类。

MethodAccess反编辑源码

// 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());  
    }  
} 

 

看了UserMethodAccess源码后明白 ReflectASM 为什么会比java放射快那么多,其实就是我们的bean调用里面的方法,速度当然很快

注意:
    1. MethodAccess.get()方法比较耗时的,特别是类方法比较多的时候,如果生成的反射类用到的地方比较多或者会多次调用,建议缓存下来,如果使用次数很少建议还是使用反射来完成功能

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    java里面的lang包源码-reflectasm:高性能Java反射

    库,它通过使用代码生成来提供高性能的反射。 生成访问类以设置/获取字段、调用方法或创建新实例。 访问类使用字节码而不是 Java 的反射,因此速度要快得多。 它还可以通过字节码访问原始字段以避免装箱。 表现 这些...

    reflectasm-1.11.3-API文档-中文版.zip

    赠送jar包:reflectasm-1.11.3.jar; 赠送原API文档:reflectasm-1.11.3-javadoc.jar; 赠送源代码:reflectasm-1.11.3-sources.jar; 赠送Maven依赖信息文件:reflectasm-1.11.3.pom; 包含翻译后的API文档:...

    ReflectASM.zip

    ReflectASM 是一个非常小的 Java 类库,通过代码生成来提供高性能的反射处理,自动为 get/set 字段提供访问类,访问类使用字节码操作而不是 Java 的反射技术,因此非常快。 性能比较: 示例代码:SomeClass ...

    reflectasm-1.11.3-API文档-中英对照版.zip

    赠送jar包:reflectasm-1.11.3.jar; 赠送原API文档:reflectasm-1.11.3-javadoc.jar; 赠送源代码:reflectasm-1.11.3-sources.jar; 赠送Maven依赖信息文件:reflectasm-1.11.3.pom; 包含翻译后的API文档:...

    reflectasm-1.01.jar

    reflectasm-1.01.jar

    reflectasm-1.07-shaded.jar

    <value>file:///root/apache-hive-1.2.1-bin/lib/minlog-1.2.jar,file:///root/apache-hive-1.2.1-bin//lib/objenesis-1.2.jar,file:///root/apache-hive-1.2.1-bin//lib/reflectasm-1.07-shaded.jar ...

    reflectasm-1.10.1.jar.zip

    java jar包,亲测试可用 安全,可以对其进行数字签名,只让能够识别数字签名的用户使用里面的东西。 加快下载速度; 压缩,使文件变小,与ZIP压缩机制完全相同。 ...能够让JAR包里面的文件依赖于统一版本的类文件。...

    reflectasm-0.8jar包

    heritrix3项目爬虫中所使用到的一个依赖包,reflectasm-0.8.jar包,有需要的朋友们,赶紧下载吧, 本人亲测过. 有积分的猿友们,赏个积分,没积分的,关注博主,私信发.

    reflectasm-1.10.1.jar

    java运行依赖jar包

    reflectasm-1.11.3.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 ...

    reflectasm-1.11.9.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 ...

    helium:Helium是使用ReflectASM的开源事件调度程序

    氦 Helium是使用ReflectASM的开源事件调度程序氦气还没有完成,一旦准备好,我会制造它,以便您可以将其添加为依赖项

    MSM--memcached session manager(memcached+tomcat7共享session所需jar包)

    MSM--memcached session manager是一个高可用的Tomcat session共享解决方案,除了可以从本机内存快速读取Session信息(仅针对黏性Session)外,同时可使用memcached存取Session,以实现高可用。对于非黏性Session,...

    tomcate7+memcached所需jar包

    commons-codec-1.5.jar couchbase-client-1.4.0.jar ... javolution-5.4.3.1.jar jettison-1.3.jar kryo-1.04.jar kryo-serializers-0.10.jar memcached-2.6.jar ... reflectasm-0.9.jar spymemcached-2.11.1.jar

    最新tomcat7+nginx/tengine+memcached共享session的jar包2016年12月

    最新tomcat7+nginx/tengine+memcached共享session的jar包2016年12月自己更新使用,更新的jar包解决了tomcat7下attribute报错的问题,理论Tomcat8以上版本可用,请... reflectasm-1.11.3.jar spymemcached-2.12.1.jar

    memcache常用jar

    以下这些jar包打成一个rar压缩包...reflectasm-1.01.jar netty-3.5.5.Final.jar msm-kryo-serializer-1.6.5.jar minlog-1.2.jar kryo-1.04.jar jettison-1.1.jar httpcore-4.1.1.jar commons-codec-1.5.jar asm-3.2.jar

    tomcat使用memcached配置session同步的所有jar包

    2.4.jar、reflectasm-1.11.3.jar、spymemcached-2.12.2.jar、memcached-session-manager-tc7-1.9.7.jar(Tomcat7使用)、memcached-session-manager-tc8-1.9.7.jar(Tomcat8使用)、memcached-session-manager-tc9-...

    objenesis-1.2.jar

    <value>file:///root/apache-hive-1.2.1-bin/lib/minlog-1.2.jar,file:///root/apache-hive-1.2.1-bin//lib/objenesis-1.2.jar,file:///root/apache-hive-1.2.1-bin//lib/reflectasm-1.07-shaded.jar ...

    memcached-session-manager

    自测适用于tomcat7,其他tomcat没有测试 asm kryo kryo-serializer kryo-serializers memcached-session-manager memcached-session-manager-tc7 minlog objenesis reflectasm spymemcached

    nginx+tomcat 8+memecache centos

    memcached-session-manager-1.8.1 ;memcached-session-manager-tc8-1.8.1;kryo-serializers-0.11;kryo-1.04;asm-3.2;minlog-1.2;msm-kryo-serializer-1.8.1;reflectasm-1.01;spymemcached-2.11.1

Global site tag (gtag.js) - Google Analytics