首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

AOP面临切面编程(三)

2013-02-04 
AOP面向切面编程(三)对任意的对象、任意的接口方法,实现任意的代理,这时可以通过InvocationHandler实现publ

AOP面向切面编程(三)

对任意的对象、任意的接口方法,实现任意的代理,这时可以通过InvocationHandler实现

public interface InvocationHandler {public void invoke(Object o, Method m);}public class TimeHandler implements InvocationHandler{private Object target;public TimeHandler(Object target) {super();this.target = target;}@Overridepublic void invoke(Object o, Method m) {long start = System.currentTimeMillis();System.out.println("starttime:" + start);System.out.println(o.getClass().getName());try {m.invoke(target);} catch (Exception e) {e.printStackTrace();}long end = System.currentTimeMillis();System.out.println("time:" + (end-start));}}public class Proxy {public static Object newProxyInstance(Class infce, InvocationHandler h) throws Exception { //JDK6 Complier API, CGLib, ASMString methodStr = "";String rt = "\r\n";Method[] methods = infce.getMethods();for(Method m : methods) {methodStr += "@Override" + rt + "public void " + m.getName() + "() {" + rt +"    try {" + rt +"    Method md = " + infce.getName() + ".class.getMethod(\"" + m.getName() + "\");" + rt +"    h.invoke(this, md);" + rt +"    }catch(Exception e) {e.printStackTrace();}" + rt +"}";}String src = "package com.bjsxt.proxy;" +  rt +"import java.lang.reflect.Method;" + rt +"public class $Proxy1 implements " + infce.getName() + "{" + rt +"    public $Proxy1(InvocationHandler h) {" + rt +"        this.h = h;" + rt +"    }" + rt +"    com.bjsxt.proxy.InvocationHandler h;" + rt +methodStr +"}";String fileName = "d:/src/com/bjsxt/proxy/$Proxy1.java";File f = new File(fileName);FileWriter fw = new FileWriter(f);fw.write(src);fw.flush();fw.close();//compileJavaCompiler 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();fileMgr.close();//load into memory and create an instanceURL[] urls = new URL[] {new URL("file:/" + "d:/src/")};URLClassLoader ul = new URLClassLoader(urls);Class c = ul.loadClass("com.bjsxt.proxy.$Proxy1");System.out.println(c);Constructor ctr = c.getConstructor(InvocationHandler.class);Object m = ctr.newInstance(h);return m;}

上边主要记录的都是如何去模拟一个AOP的实现。实际开发中,已有AOP框架后,我们一般只是需要灵活的知道怎么去使用现有的工具。比如说Spring的AOP,就可以通过xml或者注解的方式去对特定的类进行特定逻辑的代理,具体可以查看相关文档



热点排行