Aop是面向切面的编程,我的理解就是给他套包装,一层套一层。
首先来看看如何返回一个对象的代理。
package agint; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 打印日志 * @author Administrator * */ public class ShowLogHanlder implements InvocationHandler{ /** * 目标对象 */ private Object target; /** * 代理初始化 * @param target * @return */ public static Object initNextAngient( Object target){ return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new ShowLogHanlder(target)); } public ShowLogHanlder(Object target) { super(); this.target = target; } /** * 自己的代理逻辑实现 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("计算开始"); Object obj=method.invoke(target, args); System.out.println("计算结束"); return obj; } }
这个类的目的是调用其中静态的initNextAngient返回目标对象的代理。
如何实现多个代理对象的嵌套呢
package agint; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ChackValueHanlder implements InvocationHandler{ private Object target; public static Object initNextAngient( Object target){ return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new ChackValueHanlder(target)); } public ChackValueHanlder(Object target){ this.target=target; } public void CheakValue(Object obj){ double value=(Double) obj; if(value<0){ System.out.println("数据必须大于0"); }else{ System.out.println("数据合法"); } } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { for(Object obj:args){ CheakValue(obj); } try { return method.invoke(target, args); } catch (Exception e) { e.printStackTrace(); } return null; } }
上边的两个均是代理对象。嵌套代理只需下面代码实现即可
ShowLogHanlder.initNextAngient(ChackValueHanlder.initNextAngient(calucateImpl))
时间: 2024-11-08 01:06:08