這裏不作過多解釋,先經過下面的代碼生成一個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