java设计模式--代理及其动态代理--05
2011-11-14 01:01
786 查看
特点:许多解决解决问题的方法中的共同点提取出来。实现时利用java api的代理类实现,需要对工具类进行学习。
实际情况:需要对某个对象或一组对象,进行功能扩展,动态增加和取消特定功能。如日志记录功能。
优点是:把我们的代理对象和被代理对象解藕,代理者和操作者解藕。
缺点:
实现:
package sinosoft.dj.aop.proxyaop;
import java.lang.reflect.Method;
public interface IOperation {
void start(Method method);
void end(Method method);
}
实现上面接口的类.生成一个真正的操作者,如下面是日志操作者的一个类:
LoggerOperation.java
package sinosoft.dj.aop.proxyaop;
import java.lang.reflect.Method;
public class LoggerOperation implements IOperation {
public void end(Method method) {
Logger.logging(Level.DEBUGE, method.getName() + " Method end .");
}
public void start(Method method) {
Logger.logging(Level.INFO, method.getName() + " Method Start!");
}
}
然后我们要改一下代理对象DynaProxyHello中的代码.如下:
package sinosoft.dj.aop.proxyaop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynaProxyHello implements InvocationHandler {
private Object proxy;
private Object delegate;
//这个band的方法参数有几个有没有约定?
public Object bind(Object delegate,Object proxy) {
this.proxy = proxy;
this.delegate = delegate;
return Proxy.newProxyInstance(
this.delegate.getClass().getClassLoader(), this.delegate
.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
try {
//反射得到操作者的实例
Class clazz = this.proxy.getClass();
//反射得到操作者的Start方法
Method start = clazz.getDeclaredMethod("start",
new Class[] { Method.class });
//反射执行start方法
start.invoke(this.proxy, new Object[] { method });
//执行要处理对象的原本方法
result = method.invoke(this.delegate, args);
// 反射得到操作者的end方法
Method end = clazz.getDeclaredMethod("end",
new Class[] { Method.class });
// 反射执行end方法
end.invoke(this.proxy, new Object[] { method });
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
测试一下:
package sinosoft.dj.aop.proxyaop;
public class Test {
public static void main(String[] args) {
IHello hello = (IHello)new DynaProxyHello().bind(new Hello(),new LoggerOperation());
hello.sayGoogBye("Double J");
hello.sayHello("Double J");
}
}
实践:写一个记录日志的工具类通过动态代理类。
实际情况:需要对某个对象或一组对象,进行功能扩展,动态增加和取消特定功能。如日志记录功能。
优点是:把我们的代理对象和被代理对象解藕,代理者和操作者解藕。
缺点:
实现:
package sinosoft.dj.aop.proxyaop;
import java.lang.reflect.Method;
public interface IOperation {
void start(Method method);
void end(Method method);
}
实现上面接口的类.生成一个真正的操作者,如下面是日志操作者的一个类:
LoggerOperation.java
package sinosoft.dj.aop.proxyaop;
import java.lang.reflect.Method;
public class LoggerOperation implements IOperation {
public void end(Method method) {
Logger.logging(Level.DEBUGE, method.getName() + " Method end .");
}
public void start(Method method) {
Logger.logging(Level.INFO, method.getName() + " Method Start!");
}
}
然后我们要改一下代理对象DynaProxyHello中的代码.如下:
package sinosoft.dj.aop.proxyaop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynaProxyHello implements InvocationHandler {
private Object proxy;
private Object delegate;
//这个band的方法参数有几个有没有约定?
public Object bind(Object delegate,Object proxy) {
this.proxy = proxy;
this.delegate = delegate;
return Proxy.newProxyInstance(
this.delegate.getClass().getClassLoader(), this.delegate
.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
try {
//反射得到操作者的实例
Class clazz = this.proxy.getClass();
//反射得到操作者的Start方法
Method start = clazz.getDeclaredMethod("start",
new Class[] { Method.class });
//反射执行start方法
start.invoke(this.proxy, new Object[] { method });
//执行要处理对象的原本方法
result = method.invoke(this.delegate, args);
// 反射得到操作者的end方法
Method end = clazz.getDeclaredMethod("end",
new Class[] { Method.class });
// 反射执行end方法
end.invoke(this.proxy, new Object[] { method });
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
测试一下:
package sinosoft.dj.aop.proxyaop;
public class Test {
public static void main(String[] args) {
IHello hello = (IHello)new DynaProxyHello().bind(new Hello(),new LoggerOperation());
hello.sayGoogBye("Double J");
hello.sayHello("Double J");
}
}
实践:写一个记录日志的工具类通过动态代理类。
相关文章推荐
- java设计模式之四:代理模式 java静态代理和动态代理
- Java动态代理(设计模式)代码详解
- 模拟JDK动态代理(JAVA设计模式)
- 使用自动生成java文件和自动编译的动态代理模式-马士兵设计模式教程
- java设计模式26_动态代理模式
- Java设计模式系列之动态代理模式(转载)
- 设计模式之动态代理的代码实现(Java)
- java设计模式之代理模式,java动态代理
- java设计模式_动态代理(dynamicProxy)
- Java设计模式之动态代理
- java设计模式--代理模式(静态代理和动态代理)
- Java-马士兵设计模式学习笔记-代理模式--动态代理 修改成可以代理任意接口
- Java-马士兵设计模式学习笔记-代理模式-动态代理 修改成可以任意修改代理逻辑
- Java设计模式Proxy之动态代理
- java动态代理设计模式
- 设计模式:用Java动态代理实现AOP
- java设计模式之---动态代理
- JAVA设计模式之动态代理
- JAVA设计模式-11-代理模式(动态)(一)
- java设计模式(七)代理模式和java动态代理机制