静态代理设计模式由于采用硬编码的形式,代理类不具备通用性,这样就会造成大量的重复代码,为了得到统一的代理支持可以基于动态代理设计模式完成。
代码实现如下:
package com.uk.demo; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import java.lang.reflect.Method; interface IMessage{ public void send(); } class MessageReal implements IMessage{ @Override public void send() { System.out.println("【消息发送】www.dynamicproxy.com"); } } class DynProxy implements InvocationHandler{ private Object target; /** * 进行真实业务对象与代理业务对象之间的绑定处理 * @param target 真实业务对象 * @return Proxy生成的代理业务对象 */ public Object bind(Object target) { this.target = target; //依据真实对象的类加载器、实现接口以及代理调用类(InvocationHandler子类)动态创建代理对象 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } public boolean connect() { System.out.println("【消息代理】进行消息发送通道的连接。"); return true; } public void close() {//代理方法 System.out.println("【消息代理】关闭消息通道。"); } public Object invoke(Object pro, Method method, Object[] args) throws Throwable{ Object retData = null; //真实业务处理结果 if(this.connect()) { //通道是否连接 retData = method.invoke(this.target, args); //调用真实业务 this.close(); //通道关闭 } return retData; //返回执行结果 } } public class DynamicProxy { public static void main(String[] args) { IMessage msg = (IMessage) new DynProxy().bind(new MessageReal()); msg.send(); } }
运行结果:
【消息代理】进行消息发送通道的连接。
【消息发送】www.dynamicproxy.com
【消息代理】关闭消息通道。