package com.proxy;
public interface Inter {
public void sayhello();
public void sayHi();
}
package com.proxy;
public class Target implements Inter{
@Override
public void sayhello() {
System.out.println(" hello ^_^");
}
@Override
public void sayHi() {
System.out.println(" hi ~_~");
}
}
package com.proxy;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import org.apache.commons.io.FileUtils;
public class MyProxy {
public static Object newProxyInstance(Class infce) throws Exception {
String classStr = " ";
String turn="\r\n";
String mehordStr="";
for(Method m : infce.getMethods()){
mehordStr+=
" @Override"+turn+
" public void " + m.getName() + "() {"+turn+
" System.out.println(\"BEFORE:["+m.getName()+"]\");"+turn+
" inter." + m.getName() + "();"+turn+
" System.out.println(\"AFTER:["+m.getName()+"]\");"+turn+
" }"+turn;
}
classStr +=
"package com.proxy;"+turn+
"public class $Proxy0 implements "+infce.getName()+ "{"+turn+
" private "+infce.getName()+" inter;"+turn+
" public $Proxy0( "+infce.getName()+" inter) {"+turn+
" super();"+turn+
" this.inter = inter;"+turn+
" }"+turn+
mehordStr+
"}"+turn;
// 产生代理类的java文件
String filename = System.getProperty("user.dir") + "/bin/com/proxy/$Proxy0.java";
System.out.println(filename);
File file = new File(filename);
FileUtils.writeStringToFile(file, classStr);
// 编译
// 拿到编译器
JavaCompiler complier = ToolProvider.getSystemJavaCompiler();
// 文件管理者
StandardJavaFileManager fileMgr = complier.getStandardFileManager(null, null, null);
// 获取文件
Iterable units = fileMgr.getJavaFileObjects(filename);
// 编译任务
CompilationTask t = complier.getTask(null, fileMgr, null, null, null, units);
// 进行编译
t.call();
fileMgr.close();
//load 到内存
ClassLoader cl = ClassLoader.getSystemClassLoader();
Class c = cl.loadClass("com.proxy.$Proxy0");
Constructor ctr = c.getConstructor(infce);
return ctr.newInstance(new Target());
}
}
package com.proxy;
public class Test {
public static void main(String[] args) throws Exception {
Inter o=(Inter) MyProxy.newProxyInstance(Inter.class);
o.sayhello();
o.sayHi();
}
}