10
回答
ReflectASM使用
华为云实践训练营,热门技术免费实践!>>>   
ReflectASM怎么用的,能给个实例吗?
举报
路峰
发帖于5年前 10回/2K+阅
共有10个答案 最后回答: 5年前

我也研究了一番 ReflectASM,发现性能上提升不少,确实和对比数据差不多,见:

Java 下高效的反射工具包 ReflectASM 使用例解

至有楼上的朋友做了类似的测试,是因为

MethodAccess access = MethodAccess.get(TestBean.class);

这句在生成字节码时要比 JDK 反射的

Method getAgeMethod = bean.getClass().getMethod("getAge", null);

消耗比较多的时间,但是你可以让

MethodAccess access = MethodAccess.get(TestBean.class);

只执行一次,以后只需调用方法就行,而且实际上的应用场景确实也是这样子的。
--- 共有 1 条评论 ---
song314赞,不过实际情况下哪些场景我们会使用呢,会从哪些方便给我带来好处? 4年前 回复

新出来的开源项目,肯定还很少人用过,官方有几段示例代码可以参考下

http://code.google.com/p/reflectasm/

这个看起来很酷,直接访问bytecode,但是使用方法看起来还是不够优雅

要是通过Annotation或其他方式可以自动切换,代码基本不变,就最酷了 哈哈

引用来自“红薯”的答案

新出来的开源项目,肯定还很少人用过,官方有几段示例代码可以参考下

http://code.google.com/p/reflectasm/

reflectasm 是学习asm技术不错的一个开源产品。

里面的类很少,只有4个,看懂没问题。

参考reflectasm ,可以自己写一个asm相关demo了,,,替代反射的一个不错方案。

我测了之后似乎没有JDK提供的api反射快哦!
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;

import com.esotericsoftware.reflectasm.MethodAccess;
import com.huawei.reflectasm.test.bean.TestBean;

public class ReflectAsmTest {
	/***
	 * 
	 *利用reflectasm.jar实现的反射
	 */
	private static void reflectInvoke(){
		TestBean bean = new TestBean();
		MethodAccess access = MethodAccess.get(TestBean.class);
		System.out.println("MethodCount::::"+access.getMethodNames().length);
		System.out.println("Before setName::::"+access.invoke(bean,"getName"));
		access.invoke(bean, "setName", "Bravingboy.");
		System.out.println("After setName::::"+access.invoke(bean,"getName"));
		
		System.out.println("Before setAge::::"+access.invoke(bean,"getAge"));
		access.invoke(bean, "setAge", "123");
		System.out.println("After setAge::::"+access.invoke(bean,"getAge"));
		
		System.out.println("Before setBirthDay::::"+access.invoke(bean,"getBirthDay"));
		access.invoke(bean, "setBirthDay", new Date());
		System.out.println("After setBirthDay::::"+access.invoke(bean,"getBirthDay"));
	}
	/***
	 * 利用jdk的api实现的反射
	 *
	 */
	private static void jdkInvoke(){
		TestBean bean = new TestBean();
		
		System.out.println("MethodCount::::"+bean.getClass().getMethods().length);
		try {
			Method getNameMethod = bean.getClass().getMethod("getName", null);
			System.out.println("Before setName::::"+getNameMethod.invoke(bean,null));
			Method setNameMethod = bean.getClass().getMethod("setName", String.class);
			setNameMethod.invoke(bean, "Bravingboy.");
			System.out.println("After setName::::"+getNameMethod.invoke(bean,null));

			Method getAgeMethod = bean.getClass().getMethod("getAge", null);
			System.out.println("Before setAge::::"+getAgeMethod.invoke(bean,null));
			Method setAgeMethod = bean.getClass().getMethod("setAge", String.class);
			setAgeMethod.invoke(bean, "123");
			System.out.println("After setAge::::"+getAgeMethod.invoke(bean,null));
			
			Method getBirthDayMethod = bean.getClass().getMethod("getBirthDay", null);
			System.out.println("Before setAge::::"+getBirthDayMethod.invoke(bean,null));
			Method setBirthDayMethod = bean.getClass().getMethod("setBirthDay", Date.class);
			setBirthDayMethod.invoke(bean, new Date());
			System.out.println("After setAge::::"+getBirthDayMethod.invoke(bean,null));
			
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		long jdkBegin = System.currentTimeMillis();
		jdkInvoke();
		long jdkEnd = System.currentTimeMillis();
		System.out.println("pressTime::::"+(jdkEnd-jdkBegin));
		//////////////////////////////////////////////////////
		System.out.println();
		long asmBegin = System.currentTimeMillis();
		reflectInvoke();
		long asmEnd = System.currentTimeMillis();
		System.out.println("pressTime::::"+(asmEnd-asmBegin));
	}
}
 下面你是运行结果:
MethodCount::::19
Before setName::::null
After setName::::Bravingboy.
Before setAge::::null
After setAge::::123
Before setAge::::null
After setAge::::Wed Aug 15 10:43:20 CST 2012
pressTime::::17

MethodCount::::10
Before setName::::null
After setName::::Bravingboy.
Before setAge::::null
After setAge::::123
Before setBirthDay::::null
After setBirthDay::::Wed Aug 15 10:43:20 CST 2012
pressTime::::36

--- 共有 1 条评论 ---
丁海燕测试代码应用实际应用场景相一致,参考下面的回复。 5年前 回复
顶部