动态署理
署理模式是 Java 中的常用设计模式,署理类通过挪用被署理类的相关要领,提供预处理惩罚、过滤、过后处理惩罚等处事,动态署理及通过反射机制动态实现署理机制。JDK 中的 java.lang.reflect.Proxy 类可以用来实现动态署理。
首先,筹备一个简朴的接口和实现类
/** * 接口 IHello.java */ public interface IHello { void hello(); }
/** * 实现类 Hello.java */ public class Hello implements IHello { @Override public void hello() { System.out.println("我是Hello."); } }
通过 Proxy 实现动态署理
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import org.junit.Test; public class HelloTest { @Test public void testProxy() throws Exception { final IHello hello = new Hello(); /* * proxyHello : 署理主题脚色,署理类的实例 * IHello : 抽象主题脚色,署理类和被署理类都需要实现的接口,JDK中的动态署理必需针对接口 * hello : 真实主题脚色,被署理类的实例 */ IHello proxyHello = (IHello) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[] { IHello.class }, new InvocationHandler() { /* * proxy : 当前署理类的一个实例; 若挪用proxy的非final要领,将造成无限轮回挪用 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 前期的业务逻辑操纵 System.out.println("---开始"); // 挪用被署理类的要领,传入参数args,获得返回 Object object = method.invoke(hello, args); // 后期的业务逻辑操纵 System.out.println("---竣事"); return object; } }); proxyHello.hello(); } }