http://www.cnblogs.com/luotaoyeah/p/3778183.html
动态代理
代理模式是 Java 中的常用设计模式,代理类通过调用被代理类的相关方法,提供预处理、过滤、事后处理等服务,动态代理及通过反射机制动态实现代理机制。JDK 中的 java.lang.reflect.Proxy 类可以用来实现动态代理。
首先,准备一个简单的接口和实现类
1 /**2 * 接口 IHello.java3 */4 public interface IHello {5 void hello();6 }
1 /**2 * 实现类 Hello.java3 */4 public class Hello implements IHello {5 @Override6 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 @Override24 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 }