第一步:创建目标对象的接口
/** * 目标对象的接口 JDK的动态代理要求目标对象必须实现一个接口 * * @author 张明学 * */ public interface TargetInter { public void doSomething(); } 第二步: 实现接口创建目标对象
/** * 目标对象 * * @author 张明学 * */ public class Target implements TargetInter { public void doSomething() { System.out.println("目标对象的方法执行!"); } }
第三步:创建我们的拦截器对象
/** * 拦截器对象 * * @author 张明学 * */ public class Interceptor { public void before() { System.out.println("before方法执行!"); } public void after() { System.out.println("after方法执行!"); } }
第四步:创建我们的处理器
/** * 处理器类 JDK代理要求实现java.lang.reflect.InvocationHandler接口 * * @author 张明学 * */ public class MyHandler implements InvocationHandler { /** * 目标对象 */ private Object target; public void setTarget(Object target) { this.target = target; } /** * 拦截器对象 */ private Interceptor interceptor = new Interceptor(); /** * invoke为真正执行的方法 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; interceptor.before(); result = method.invoke(target, args); interceptor.after(); return result; } } 第五步:创建代理对象
/** * 代理对象 * * @author 张明学 * */ public class MyProxy { /** * 得到对象的实例 * @param obj * @return */ public Object getProxy(Object obj) { MyHandler myHandler = new MyHandler(); myHandler.setTarget(obj); /** * 第一个参数:得到目标对象的class对象的ClassLoader * 第二个参数:目标对象所实现的接口数组 * 第三个参数:真正执行的对象(处理器) */ return Proxy.newProxyInstance(Target.class.getClassLoader(), obj .getClass().getInterfaces(), myHandler); } }
测试:
public class MyTest { public static void main(String[] args) { TargetInter targer = new Target(); MyProxy myProxy = new MyProxy(); /** * 得到代理 */ TargetInter proxy = (TargetInter) myProxy.getProxy(targer);
proxy.doSomething(); } }