ASMSupport教程1:簡單的HelloWorld

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

相關文章
相關標籤/搜索