JDK 的动态代理
因为他是基于接口的 我看书上说他其实是如果有接口默认就上JDK动态代理了,我们实现以下:
【听说学个之前要有JDK代理模式的基础 我就不 直接淦就完了!】
什么包都不用导
新建一个目标接口:
package com.bihu; public interface TargetInterface { public void method(); }
新建一个目标对象 (被增强) 且 继承目标接口:
package com.bihu; public class Target implements TargetInterface{ @Override public void method() { System.out.println("method Running·····"); } }
再来一个增强(相当被抽取的那个)方法:
package com.bihu; public class Enhance { public void before(){ System.out.println("前置增强..."); } public void after(){ System.out.println("后置增强..."); } }
再来一个测试的 即调用类:
package com.bihu; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class AgentTest { public static void main(String[] args) { //new 一个 目标对象 final Target target = new Target(); //new 一个 增强对象 final Enhance enhance = new Enhance(); /** * public static Object newProxyInstance(ClassLoader loader, * Class<?>[] interfaces, * InvocationHandler h) * 三个参数啊: * 第一个 目标对象类加载器 * 第二个 目标对象相同的接口字节码对象数组 * 第三个 一个接口 下面演示直接用匿名函数 */ TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { /** * 其实调用代理对象任何的方法 实质最后还是执行这个 invoke 方法。 * 这里三个参数, 第一个是proxy -代理实例;第二个是 method代理实例的 方法实例;第三个是 args -包含在方法上通过代理实例调用的实参的值对象的数组,或 null如果接口方法不需要参数 */ //执行增强方法(前) enhance.before(); Object invoke = method.invoke(target, args);//执行目标方法 //执行增强方法(后) enhance.after(); return invoke; } }); //调用测试 //主要是这里往里看比较容易懂 proxy.method(); } }
这里慢慢看 即可看懂,有些没学过 但是呢 道理都一样