动态代理
代理模式是 Java 中的常用设计模式,代理类通过调用被代理类的相关方法,提供预处理、过滤、事后处理等服务,动态代理及通过反射机制动态实现代理机制。JDK 中的 java.lang.reflect.Proxy 类可以用来实现动态代理。
首先,准备一个简单的接口和实现类
1 /** 2 * 接口 IHello.java 3 */ 4 public interface IHello { 5 void hello(); 6 }
1 /** 2 * 实现类 Hello.java 3 */ 4 public class Hello implements IHello { 5 @Override 6 public void hello() { 7 System.out.println("我是Hello."); 8 } 9 }
通过 Proxy 实现动态代理
1 import java.lang.reflect.InvocationHandler; 2 import java.lang.reflect.Method; 3 import java.lang.reflect.Proxy; 4 5 import org.junit.Test; 6 7 public class HelloTest { 8 @Test 9 public void testProxy() throws Exception { 10 final IHello hello = new Hello(); 11 12 /* 13 * proxyHello : 代理主题角色,代理类的实例 14 * IHello : 抽象主题角色,代理类和被代理类都需要实现的接口,JDK中的动态代理必须针对接口 15 * hello : 真实主题角色,被代理类的实例 16 */ 17 IHello proxyHello = (IHello) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), 18 new Class[] { IHello.class }, new InvocationHandler() { 19 20 /* 21 * @param proxy : 当前代理类的一个实例; 若在invoke()方法中调用proxy的非final方法,将造成无限循环调用. 22 */ 23 @Override 24 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 25 26 // 前置的业务逻辑操作 27 System.out.println("---开始"); 28 29 // 调用被代理类的方法,传入参数args,得到返回 30 Object object = method.invoke(hello, args); 31 32 // 后置的业务逻辑操作 33 System.out.println("---结束"); 34 35 return object; 36 } 37 }); 38 39 proxyHello.hello(); 40 } 41 }