`
xiaoqiangcn
  • 浏览: 39878 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

ReflectASM,高性能的反射

    博客分类:
  • 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()方法比较耗时的,特别是类方法比较多的时候,如果生成的反射类用到的地方比较多或者会多次调用,建议缓存下来,如果使用次数很少建议还是使用反射来完成功能
   
分享到:
评论
1 楼 zh_harry 2013-04-25  
理论上是应该生成这样的一个文件,跟踪代码看了,但是物理文件夹下没有发现这个文件啊,经测试,get确实很耗时,invoke方法很快,跟java的invoke差几十倍,但跟java的非反射方法相比,性能还是差很多,如果是采用switch判断来实的现的话,理论上应该跟java的非反射方法效率相当才对,类文件未找到。有线帮忙看下... 492006183 QQ

相关推荐

    高性能Java反射.zip

    概述ReflectASM 是一个非常小的 Java 库,它通过使用代码生成提供高性能反射。生成一个访问类来设置/获取字段、调用方法或创建新实例。访问类使用字节码而不是 Java 的反射,因此速度更快。它还可以通过字节码访问...

    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`:一个简单的日志库,...

Global site tag (gtag.js) - Google Analytics