什么是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()方法比较耗时的,特别是类方法比较多的时候,如果生成的反射类用到的地方比较多或者会多次调用,建议缓存下来,如果使用次数很少建议还是使用反射来完成功能
分享到:
相关推荐
概述ReflectASM 是一个非常小的 Java 库,它通过使用代码生成提供高性能反射。生成一个访问类来设置/获取字段、调用方法或创建新实例。访问类使用字节码而不是 Java 的反射,因此速度更快。它还可以通过字节码访问...
库,它通过使用代码生成来提供高性能的反射。 生成访问类以设置/获取字段、调用方法或创建新实例。 访问类使用字节码而不是 Java 的反射,因此速度要快得多。 它还可以通过字节码访问原始字段以避免装箱。 表现 这些...
ReflectASM 是一个非常小的 Java 类库,通过代码生成来提供高性能的反射处理,自动为 get/set 字段提供访问类,访问类使用字节码操作而不是 Java 的反射技术,因此非常快。 性能比较: 示例代码:SomeClass ...
ReflectASM是一个轻量级、高性能的Java反射库,旨在提高反射操作的速度。它通过字节码生成技术来实现,能够在运行时快速访问和修改对象的字段,以及调用方法。与标准Java反射API相比,ReflectASM在许多场景下可以...
使用了ReflectASM这一高性能的字节码库,Helium能够在运行时优化其性能,提高事件处理的速度。 ReflectASM是一个轻量级的库,专门用于Java类的反射操作。它通过生成字节码提供更快的访问速度,相比于传统的Java反射...
7. `reflectasm-1.10.1.jar`:ReflectASM是一个小型的、高性能的代码生成库,用于反射操作,可能在Kryo或MSM的实现中用到。 8. `minlog-1.3.0.jar`:这是一个轻量级的日志库,用于记录MSM和其他组件的调试和诊断...
5. `reflectasm-0.9.jar`: 提供了高效的反射API,可能用于Kryo库中优化对象序列化和反序列化过程。 6. `spymemcached-2.10.0.jar`: 这是SpyMemcached客户端库,用于与Memcached服务器通信。 7. `minlog-1.2.jar`: ...
10. **reflectasm-1.01.jar**: ReflectASM是一个轻量级的Java反射库,可能用于优化Kryo或其他库的性能。 这些jar包的整合使得Tomcat能够与Memcached通信,通过Kryo进行高效序列化,将用户的session数据安全地存储在...
7. **reflectasm-0.9.jar**:这是一个高性能的反射库,可能被Kryo等序列化库用于提高反射操作的效率。 在实际配置中,你需要在Tomcat的`context.xml`或`server.xml`文件中配置`MemcachedSessionManager`,并指定...
Memcached 是一个高性能的分布式内存对象缓存系统,常用于减轻数据库负载,提高Web应用的响应速度。在Java环境中使用Memcached,我们需要依赖特定的Java库,即jar包。以下是一些关键的jar包及其作用: 1. **...
Memcached是一种高性能、分布式内存对象缓存系统,用于在分布式环境中快速存储和检索数据。它通过将数据存储在内存中,显著提高了应用的响应速度,减轻了数据库的负载。在这个主题中,我们将深入探讨与“memcached所...
5. **reflectasm-1.09-shaded.jar** 和 **asm-3.2.jar**:ReflectASM是一个轻量级、高性能的Java反射库,而ASM是一个底层的Java字节码操作和分析框架。这两个库通常用于类的动态生成和修改,可能在序列化过程中发挥...
- `fastutil`:提供了一些高性能的集合类,如int、long数组,Kryo可能会用到。 4. **应用场景**: - 分布式系统:Kryo常用于分布式计算框架如Hadoop、Spark,作为数据交换的序列化工具。 - 缓存系统:在...
1. **Memcached**: Memcached是一种高性能的分布式内存缓存服务,通过在内存中存储数据,减少对数据库的访问,从而提高系统的响应速度和并发处理能力。它支持多种编程语言,包括Java。 2. **Java与Memcached的连接*...
Memcached作为一个高性能的分布式内存对象缓存系统,常被用来解决这个问题。 描述中提到的“nginx+tomcat8+memcached session共享所需jar包,直接放到tomcat/lib下即可”,暗示了实现这一功能需要一些特定的Java库...
Spy Memcached是Java实现的一个高性能、易于使用的Memcached客户端,支持多种协议和操作,包括设置、获取、删除等会话操作。 2. `kryo-4.0.0.jar` 和 `kryo-serializers-0.41.jar`:Kryo是一个快速、高效的序列化库...
Memcached是一种高性能的分布式内存对象缓存系统,常用于减轻数据库负载,提升Web应用性能。在Java应用中,通过特定的jar包可以实现session的跨服务器共享,确保用户会话在集群中的各个节点间保持一致。 描述虽然...
7. `reflectasm-1.01.jar`:反射优化库,可能被Kryo用来提高序列化性能。 8. `memcached-session-manager-tc7-1.6.5.jar`:针对Tomcat 7的特定版本,提供与Tomcat的适配。 9. `minlog-1.2.jar`:一个简单的日志库,...