JDK动态代理(下)
从上面的例子我们看出.只要你是采用面向接口编程,那么,你的任何对象的方法执行之前要加上记录日志的操作都是可以的.他(DynaPoxyHello)自动去代理执行被代理对象(Hello)中的每一个方法,一个java.lang.reflect.InvocationHandler接口就把我们的代理对象和被代理对象解藕了.但是,我们又发现还有一个问题,这个DynaPoxyHello对象只能跟我们去在方法前后加上日志记录的操作.我们能不能把DynaPoxyHello对象和日志操作对象(Logger)解藕呢?
结果是肯定的.让我们来分析一下我们的需求.
我们要在被代理对象的方法前面或者后面去加上日志操作代码(或者是其它操作的代码),
那么,我们可以抽象出一个接口,这个接口里就只有两个方法,一个是在被代理对象要执行方法之前执行的方法,我们取名为start,第二个方法就是在被代理对象执行方法之后执行的方法,我们取名为end .接口定义如下 :
我们去写一个实现上面接口的类.我们把作他真正的操作者,如下面是日志操作者的一个类:
LoggerOperation.java
结果是肯定的.让我们来分析一下我们的需求.
我们要在被代理对象的方法前面或者后面去加上日志操作代码(或者是其它操作的代码),
那么,我们可以抽象出一个接口,这个接口里就只有两个方法,一个是在被代理对象要执行方法之前执行的方法,我们取名为start,第二个方法就是在被代理对象执行方法之后执行的方法,我们取名为end .接口定义如下 :
1packagesinosoft.dj.aop.proxyaop;
2
3importjava.lang.reflect.Method;
4
5publicinterfaceIOperation{
6 /**
7 * 方法执行之前的操作
8 *@parammethod
9 */
10 voidstart(Method method);
11 /**
12 * 方法执行之后的操作
13 *@parammethod
14 */
15 voidend(Method method);
16}
17
2
3importjava.lang.reflect.Method;
4
5publicinterfaceIOperation{
6 /**
7 * 方法执行之前的操作
8 *@parammethod
9 */
10 voidstart(Method method);
11 /**
12 * 方法执行之后的操作
13 *@parammethod
14 */
15 voidend(Method method);
16}
17
我们去写一个实现上面接口的类.我们把作他真正的操作者,如下面是日志操作者的一个类:
LoggerOperation.java
packagesinosoft.dj.aop.proxyaop;
importjava.lang.reflect.Method;
publicclassLoggerOperationimplementsIOperation{
publicvoidend(Method method){
Logger.logging(Level.DEBUGE, method.getName()+"Method end.");
}
publicvoidstart(Method method){
Logger.logging(Level.INFO, method.getName()+"Method Start!");
}
}
importjava.lang.reflect.Method;
publicclassLoggerOperationimplementsIOperation{
publicvoidend(Method method){
Logger.logging(Level.DEBUGE, method.getName()+"Method end.");
}
publicvoidstart(Method method){
Logger.logging(Level.INFO, method.getName()+"Method Start!");
}
}