ASMSupport教程1:简单的HelloWorld

这里不做过多解释,先通过下面的代码生成一个class,再通过反射调用其main方法,感受下ASMSupport的奇妙

1.首先创建一个抽象类

public abstract class AbstractExample {

/**
 * system.out global variable
 */
public static GlobalVariable systemOut = AClassFactory.getProductClass(System.class).getGlobalVariable("out");

public static Class<?> generate(IClassContext creator){
	//_这是Class的输出路径。主要为了调试作用。我们通过asmsupport生成的class将获输出到这个路径
	//你可以通过反编译软件看看我们生成的结果
	creator.setClassOutPutPath(".//target//");
	
	//这个就是个开关。前面我们把该创建的方法变量都放到了传送带上了。调用startup
	//启动传送带,将上面的东西一个个处理给我返回一个我们需要的成品(就是class了)
	Class<?> cls = creator.startup();
	
	//如果创建的是非枚举类型或者非接口类型则调用main方法
	if(creator instanceof ClassCreator){
		try {
			cls.getMethod("main", String[].class).invoke(cls, new Object[]{null});
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
	
	return cls;
}

}

2.接下来就是asmsupport生成class的代码了

public class HelloWorld extends AbstractExample{

/**
 * @throws NoSuchMethodException 
 * @throws SecurityException 
 * @throws InvocationTargetException 
 * @throws IllegalAccessException 
 * @throws IllegalArgumentException 
 */
public static void main(String[] args) {
	ClassCreator creator = new ClassCreator(Opcodes.V1_5, Opcodes.ACC_PUBLIC , "generated.helloworld.HelloWorldExample", null, null);
	creator.createStaticMethod("main", new AClass[]{AClassFactory.getProductClass(String[].class)}, new String[]{"args"}, null, null,
			Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, new StaticMethodBody(){

				@Override
				public void generateBody(LocalVariable... argus) {
					invoke(systemOut, "println", Value.value("Hello World"));
					//don't forget return.
					runReturn();
				}
		
	});
	generate(creator);
}

}

3.OK 直接run这个HelloWorld类,在打印的最下面一行出现了我们熟悉的“Hello World”

文章地址:http://my.oschina.net/wensiqun/blog/116067

ASM源码地址:https://amssupport.googlecode.com/svn/trunk/ 文章实例地址:http://amssupport.googlecode.com/svn/trunk/asmsupport/src/test/java/example/helloworld/ 以上代码均可通过svn下载

转载于:https://my.oschina.net/wensiqun/blog/116067

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值