`
stephen830
  • 浏览: 2998068 次
  • 性别: 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.zip

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

    High performance Java reflection.zip

    ReflectASM是一个轻量级、高性能的Java反射库,旨在提高反射操作的速度。它通过字节码生成技术来实现,能够在运行时快速访问和修改对象的字段,以及调用方法。与标准Java反射API相比,ReflectASM在许多场景下可以...

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

    使用了ReflectASM这一高性能的字节码库,Helium能够在运行时优化其性能,提高事件处理的速度。 ReflectASM是一个轻量级的库,专门用于Java类的反射操作。它通过生成字节码提供更快的访问速度,相比于传统的Java反射...

    nginx+tomcat7+memcached所需jar

    7. `reflectasm-1.10.1.jar`:ReflectASM是一个小型的、高性能的代码生成库,用于反射操作,可能在Kryo或MSM的实现中用到。 8. `minlog-1.3.0.jar`:这是一个轻量级的日志库,用于记录MSM和其他组件的调试和诊断...

    Nginx+Tomcat6+Membercached 实现负载均衡

    5. `reflectasm-0.9.jar`: 提供了高效的反射API,可能用于Kryo库中优化对象序列化和反序列化过程。 6. `spymemcached-2.10.0.jar`: 这是SpyMemcached客户端库,用于与Memcached服务器通信。 7. `minlog-1.2.jar`: ...

    nginx+tomcat7+memcached

    10. **reflectasm-1.01.jar**: ReflectASM是一个轻量级的Java反射库,可能用于优化Kryo或其他库的性能。 这些jar包的整合使得Tomcat能够与Memcached通信,通过Kryo进行高效序列化,将用户的session数据安全地存储在...

    tomcat 做session共享所需jar包压缩包

    7. **reflectasm-0.9.jar**:这是一个高性能的反射库,可能被Kryo等序列化库用于提高反射操作的效率。 在实际配置中,你需要在Tomcat的`context.xml`或`server.xml`文件中配置`MemcachedSessionManager`,并指定...

    memcached 需要的jar包

    Memcached 是一个高性能的分布式内存对象缓存系统,常用于减轻数据库负载,提高Web应用的响应速度。在Java环境中使用Memcached,我们需要依赖特定的Java库,即jar包。以下是一些关键的jar包及其作用: 1. **...

    memcached所需JAR包

    Memcached是一种高性能、分布式内存对象缓存系统,用于在分布式环境中快速存储和检索数据。它通过将数据存储在内存中,显著提高了应用的响应速度,减轻了数据库的负载。在这个主题中,我们将深入探讨与“memcached所...

    memcached-session-manager集成包

    5. **reflectasm-1.09-shaded.jar** 和 **asm-3.2.jar**:ReflectASM是一个轻量级、高性能的Java反射库,而ASM是一个底层的Java字节码操作和分析框架。这两个库通常用于类的动态生成和修改,可能在序列化过程中发挥...

    Kryo所需的依赖包

    - `fastutil`:提供了一些高性能的集合类,如int、long数组,Kryo可能会用到。 4. **应用场景**: - 分布式系统:Kryo常用于分布式计算框架如Hadoop、Spark,作为数据交换的序列化工具。 - 缓存系统:在...

    memcached、tomcat集成所需包

    1. **Memcached**: Memcached是一种高性能的分布式内存缓存服务,通过在内存中存储数据,减少对数据库的访问,从而提高系统的响应速度和并发处理能力。它支持多种编程语言,包括Java。 2. **Java与Memcached的连接*...

    tomcat8+memcached session共享

    Memcached作为一个高性能的分布式内存对象缓存系统,常被用来解决这个问题。 描述中提到的“nginx+tomcat8+memcached session共享所需jar包,直接放到tomcat/lib下即可”,暗示了实现这一功能需要一些特定的Java库...

    msm_libs.zip

    Spy Memcached是Java实现的一个高性能、易于使用的Memcached客户端,支持多种协议和操作,包括设置、获取、删除等会话操作。 2. `kryo-4.0.0.jar` 和 `kryo-serializers-0.41.jar`:Kryo是一个快速、高效的序列化库...

    memcached共享session需要的jar包

    Memcached是一种高性能的分布式内存对象缓存系统,常用于减轻数据库负载,提升Web应用性能。在Java应用中,通过特定的jar包可以实现session的跨服务器共享,确保用户会话在集群中的各个节点间保持一致。 描述虽然...

    负载均衡session共享memcached jar包

    7. `reflectasm-1.01.jar`:反射优化库,可能被Kryo用来提高序列化性能。 8. `memcached-session-manager-tc7-1.6.5.jar`:针对Tomcat 7的特定版本,提供与Tomcat的适配。 9. `minlog-1.2.jar`:一个简单的日志库,...

    session共享jar包

    8. `reflectasm-1.01.jar` 和 `minlog-1.2.jar`:这两个库分别是反射优化和轻量级日志库,它们可能作为Kryo或其它库的依赖,提供性能优化和日志记录功能。 总结起来,这个jar包集合提供了实现Nginx+Memcached ...

Global site tag (gtag.js) - Google Analytics