JAVA动态代理基本实现

使用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删除!
方法执行后检查...

你可能感兴趣的:(java)