这里不作过多解释,先经过下面的代码生成一个class,再经过反射调用其main方法,感觉下ASMSupport的奇妙java
1.首先建立一个抽象类ide
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; }
}svn
2.接下来就是asmsupport生成class的代码了google
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); }
}.net
3.OK 直接run这个HelloWorld类,在打印的最下面一行出现了咱们熟悉的“Hello World”调试
文章地址:http://my.oschina.net/wensiqun/blog/116067code
ASM源码地址:https://amssupport.googlecode.com/svn/trunk/ 文章实例地址:http://amssupport.googlecode.com/svn/trunk/asmsupport/src/test/java/example/helloworld/ 以上代码都可经过svn下载blog