ReflectASM,高性能的反射

ReflectASM是一个小巧的Java库,利用ASM生成类的方式实现反射功能,相比标准Java反射速度快得多。本文介绍ReflectASM的基本使用方法,并深入探讨其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

如何使用
Java代码  收藏代码
  1. public class User {  
  2.     private int id;  
  3.     private String name;  
  4.   
  5.     public int getId() {  
  6.         return id;  
  7.     }  
  8.   
  9.     public void setId(int id) {  
  10.         this.id = id;  
  11.     }  
  12.   
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.   
  17.     public void setName(String name) {  
  18.         this.name = name;  
  19.     }  
  20. }  
  21.   
  22.   
  23.   
  24. public class ReflectAsmTest {  
  25.     public static void main(String[] args) {  
  26.         User user = new User();  
  27.         //使用reflectasm生产User访问类  
  28.         MethodAccess access = MethodAccess.get(User.class);  
  29.         //invoke setName方法name值  
  30.         access.invoke(user, "setName""张三");  
  31.         //invoke getName方法 获得值  
  32.         String name = (String)access.invoke(user, "getName"null);  
  33.         System.out.println(name);  
  34.     }  
  35. }  


输出: 
张三 

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

MethodAccess反编辑源码 
Java代码  收藏代码
  1. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.  
  2. // Jad home page: http://www.kpdus.com/jad.html  
  3. // Decompiler options: packimports(3)   
  4.   
  5. package com.johhny.ra;  
  6.   
  7. import com.esotericsoftware.reflectasm.MethodAccess;  
  8.   
  9. // Referenced classes of package com.johhny.ra:  
  10. //            User  
  11.   
  12. public class UserMethodAccess extends MethodAccess  
  13. {  
  14.   
  15.     public UserMethodAccess()  
  16.     {  
  17.     }  
  18.   
  19.     /** 
  20.      * 这个方法是主要是实现了MethodAccess 的抽象方法,来实现反射的功能   
  21.      * @param obj  需要反射的对象 
  22.      * @param i  class.getDeclaredMethods 对应方法的index 
  23.      * @param 参数对象集合 
  24.      * @return 
  25.      */  
  26.     public transient Object invoke(Object obj, int i, Object aobj[])  
  27.     {  
  28.         User user = (User)obj;  
  29.         switch(i)  
  30.         {  
  31.         case 0// '\0'  
  32.             return user.getName();  
  33.   
  34.         case 1// '\001'  
  35.             return Integer.valueOf(user.getId());  
  36.   
  37.         case 2// '\002'  
  38.             user.setName((String)aobj[0]);  
  39.             return null;  
  40.   
  41.         case 3// '\003'  
  42.             user.setId(((Integer)aobj[0]).intValue());  
  43.             return null;  
  44.         }  
  45.         throw new IllegalArgumentException((new StringBuilder("Method not found: ")).append(i).toString());  
  46.     }  
  47. }  
: 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值