ReflectASM,高性能的反射
什么是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);}}
// 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:// Userpublic 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()); }}: