使用JDK 6.0 动态编译
更多详细的步骤分析见附件
public class CompilerTest {
public static void main(String[] args) throws Exception {
//构建源代码
StringBuffer src = new StringBuffer();
String rt = "\r\n";
src.append("package com.dolla;").append(rt);
src.append("public class Tank {").append(rt);
src.append(" public void move() {").append(rt);
src.append(" System.out.println(\"tank moving......\");").append(rt);
src.append(" }").append(rt);
src.append("}").append(rt);
//保存源代码成Java文件
String tmpJavaFile = System.getProperty("user.dir")+"/src/com/dolla/Tank.java";
FileWriter fileWriter = new FileWriter(tmpJavaFile);
fileWriter.write(src.toString());
fileWriter.flush();
fileWriter.close();
//使用javac.jar 编译器进行编译
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
//获得源文件管理
StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
Iterable units = fileMgr.getJavaFileObjects(tmpJavaFile);
//产生编译任务
CompilationTask task = compiler.getTask(null, fileMgr, null, null, null,units);
task.call();
System.out.println("动态编译对象成功.....");
}
}
public class ProxyTest1 {
public static void main(String[] args) {
//逻辑处理类-传入接口实现类的,用于$Proxy0.invoke()回调方法时,进入到用户处理的业务方法
InvocationHandler handler = new AuthorityCheckProxy(new UserMgrImpl());
//根据接口类,动态遍历接口的方法,遍历动态生成代理方法,最终返回一个实现了接口的代理类$Proxy0,代理类的方法里面,主要是做调用handler.invoke()方法
//使得可以回调到用户实现的接口代理逻辑处理类InvocationHandler
UserMgr userMgrProxy = (UserMgr)Proxy.newProxyInstance(UserMgr.class.getClassLoader(),new Class[]{UserMgr.class},handler);
userMgrProxy.remove(new User("Dolla"));
}
}
//用户操作接口
interface UserMgr{
void remove(User u);
}
//接口实现类
class UserMgrImpl implements UserMgr{
@Override
public void remove(User u) {
System.out.println("用户:"+u.getName() + "删除!");
}
}
//代理逻辑处理类--权限的逻辑检查
class AuthorityCheckProxy implements InvocationHandler{
private Object target;
public AuthorityCheckProxy(Object target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] aobj)
throws Throwable {
System.out.println("方法执行前检查...");
System.out.println("权限检查成功....");
Object o =method.invoke(target, aobj);
System.out.println("方法执行后检查...");
return o;
}
}
输出结果如下:UserMgr userMgrProxy = (UserMgr)Proxy.newProxyInstance()
得到代理对象名称是$Proxy0其实是一个,也就是实现了UserMgr接口的子类
UserMgr userMgrProxy = new $Proxy0();
生成的动态代理名称:com.dolla.$Proxy0
方法执行前检查...
权限检查成功....
用户:Dolla删除!
方法执行后检查...