JDK动态代理(续)

JDK动态代理(续)
然后我们要改一下代理对象DynaProxyHello中的代码.如下:
1 package sinosoft.dj.aop.proxyaop;
2
3 import java.lang.reflect.InvocationHandler;
4 import java.lang.reflect.Method;
5 import java.lang.reflect.Proxy;
6
7 public class DynaProxyHello implements InvocationHandler {
8  /**
9      * 操作者
10     */

11    privateObject proxy;
12  /**
13      * 要处理的对象(也就是我们要在方法的前后加上业务逻辑的对象,如例子中的Hello)
14     */

15    privateObject delegate;
16
17/**
18      * 动态生成方法被处理过后的对象 (写法固定)
19      *
20      *@paramdelegate
21      *@paramproxy
22      *@return
23     */

24    publicObject bind(Object delegate,Object proxy){
25        
26        this.proxy=proxy;
27        this.delegate=delegate;
28        returnProxy.newProxyInstance(
29                this.delegate.getClass().getClassLoader(),this.delegate
30                         .getClass().getInterfaces(),this);
31     }

32  /**
33      * 要处理的对象中的每个方法会被此方法送去JVM调用,也就是说,要处理的对象的方法只能通过此方法调用
34      * 此方法是动态的,不是手动调用的
35     */

36    publicObject invoke(Object proxy, Method method, Object[] args)
37            throwsThrowable{
38         Object result=null;
39        try{
40            //反射得到操作者的实例
41             Class clazz=this.proxy.getClass();
42            //反射得到操作者的Start方法
43             Method start=clazz.getDeclaredMethod("start",
44                    newClass[]{ Method.class});
45            //反射执行start方法
46             start.invoke(this.proxy,newObject[]{ method });
47            //执行要处理对象的原本方法
48             result=method.invoke(this.delegate, args);
49//             反射得到操作者的end方法
50             Method end=clazz.getDeclaredMethod("end",
51                    newClass[]{ Method.class});
52//             反射执行end方法
53             end.invoke(this.proxy,newObject[]{ method });
54
55         }
catch(Exception e){
56             e.printStackTrace();
57         }

58        returnresult;
59     }

60
61}

62

然后我们把Test.java中的代码改一下.测试一下:
package sinosoft.dj.aop.proxyaop;

public class Test {
    
publicstaticvoidmain(String[] args){
         IHello hello
=(IHello)newDynaProxyHello().bind(newHello(),newLoggerOperation());
         hello.sayGoogBye(
"Double J");
         hello.sayHello(
"Double J");
        
     }

}

结果还是一样的吧.

如果你想在每个方法之前加上日志记录,而不在方法后加上日志记录.你就把LoggerOperation类改成如下:
1 package sinosoft.dj.aop.proxyaop;
2
3 import java.lang.reflect.Method;
4
5 public class LoggerOperation implements IOperation {
6
7    publicvoidend(Method method){
8        //Logger.logging(Level.DEBUGE, method.getName() + " Method end.");
9     }

10
11    publicvoidstart(Method method){
12         Logger.logging(Level.INFO, method.getName()+"Method Start!");
13     }

14
15}

16

运行一下.你就会发现,每个方法之后没有记录日志了. 这样,我们就把代理者和操作者解藕了!

下面留一个问题给大家,如果我们不想让所有方法都被日志记录,我们应该怎么去解藕呢.?
我的想法是在代理对象的public Object invoke(Object proxy, Method method, Object[] args)方法里面加上个if(),对传进来的method的名字进行判断,判断的条件存在XML里面.这样我们就可以配置文件时行解藕了.如果有兴趣的朋友可以把操作者,被代理者,都通过配置文件进行配置 ,那么就可以写一个简单的SpringAOP框架了.

你可能感兴趣的:(JDK动态代理(续))