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;
}
}
proxy,Compiler,load class into memory and create a instance
最新推荐文章于 2024-10-18 11:40:41 发布