proxy,Compiler,load class into memory and create a instance

package com.zjx.proxy;

import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;

public class Proxy {

	public static Object newProxyInstantce(Class infce) throws Exception {//JDK6 Complier API,CGLib,ASM
		String methodStr = "";
		String tb = "\r\n";
		
		//reflection
		Method[] methods = infce.getMethods();
		for(Method m : methods){
			methodStr +="	@Override" + tb +
						"	public void " + m.getName() + "(){" + tb + 
						"		long start = System.currentTimeMillis();"+ tb +
						"		System.out.println(\"starttime : \"+start);"+ tb +
						"		t." +m.getName() + "();" + tb +
						"		long end = System.currentTimeMillis();"+ tb +
						"		System.out.println(\"time:\" + (end - start));"+ tb +
						"	}";
		}
		
		String src = "package com.zjx.proxy;"+ tb +
			"public class TimeProxy implements "+ infce.getName() + "{"+ tb +
			"		Moveable t;"+ tb +
			"   	public TimeProxy(Moveable t){"+ tb +
			"      		super();"+ tb +
			"			this.t = t;"+ tb +
			"		}"+ tb +
			methodStr + tb +
			"}";
		//file 
		String fileName = System.getProperty("user.dir")+"/src/com/zjx/proxy/TimeProxy.java";
		File f = new File(fileName);
		FileWriter fw = new FileWriter(f);
		fw.write(src);
		fw.flush();
		if(fw !=null)
			fw.close();
		
		
		//compile
		JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
		StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
		Iterable units = fileMgr.getJavaFileObjects(fileName);
		CompilationTask t = compiler.getTask(null, fileMgr, null, null, null, units);
		t.call();
		if(fileMgr != null)
			fileMgr.close();
		
		//load into memory and create an instance
		URL[] urls = new URL[]{new URL("file:/" + System.getProperty("user.dir") + "/src")};
		URLClassLoader ul = new URLClassLoader(urls);
		Class c = ul.loadClass("com.zjx.proxy.TimeProxy");
		
		Constructor ctr = c.getConstructor(Moveable.class);
		Object m = ctr.newInstance(new Tank());
		return m;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值