//结果 enhancing eat
jdk动态代理:jdk自带,被代理类实现接口,委托类(handler)实现InvocationHandler,方法增强可以写在invoke中。上代码
package com.mmh.springbootall.test; /** * @Description: jdk动态代理--接口 * @Author : myron * @Date : 2020-06-23 14:14 **/ public interface Person { void hello(); }
package com.mmh.springbootall.test; /** * @Description: jdk动态代理--被代理类 * @Author : myron
package com.mmh.springbootall.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @Description: jdk动态代理--委托类 * * 用来做生成代理类的前置逻辑 * 用来做方法增强:invoke方法 * * @Author : myron * @Date : 2020-06-23 14:17 **/ public class CustomJdkInvocationHandler implements InvocationHandler { private Object target; public void setTarget(Object target){ this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //方法增强 System.out.println("i'm invocation handler before"); Object o = method.invoke(target, args); //方法增强 System.out.println("i'm invocation handler after"); return o ; } public Object createProxyObject(){ return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this); } }
* @Date : 2020-06-23 14:15 **/ public class Man implements Person{ @Override public void hello() { System.out.println("hello"); } }
package com.mmh.springbootall.test; /** * @Description: jdk动态代理--测试类 * @Author : myron * @Date : 2020-06-23 14:22 **/ public class JdkDynamicProxyTest { public static void main(String[] args){ Person p = new Man(); //代理委托类 CustomJdkInvocationHandler handler = new CustomJdkInvocationHandler(); //设置被代理类 handler.setTarget(p); //生成代理类 Person proxyObject = (Person)handler.createProxyObject(); proxyObject.hello(); } }
//结果 i'm invocation handler before hello i'm invocation handler after
cglib动态代理 :jdk1.3替代产品
package com.mmh.springbootall.test; import com.alibaba.fastjson.JSONObject; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * @Description: Cglib动态代理--父类 * @Author : myron * @Date : 2020-06-23 14:57 **/ public class Animal { private void run() { System.out.println("run"); } public void eat() { System.out.println("eat"); } }
package com.mmh.springbootall.test; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * @Description: Cglib动态代理--拦截器(类似委托类) * <p> * 用来做生成代理类的前置逻辑 * 用来做方法增强:intercept方法 * Enhancer:生成代理类 * 但因为采用的是继承,所以不能对final修饰的类进行代理 * @Author : myron * @Date : 2020-06-23 15:38 **/ public class CustomCglibMethodInterceptor implements MethodInterceptor { /** * 会生成 target 的 子类(代理类) * @param target 被代理类 * @return */ public Object createProxy(Object target) { Enhancer enhancer = new Enhancer(); enhancer.setCallback(this); enhancer.setSuperclass(target.getClass()); return enhancer.create(); } @Override public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy proxy) throws Throwable { //增强 System.out.println("enhancing"); return proxy.invokeSuper(arg0, arg2); } }
package com.mmh.springbootall.test; /** * @Description: Cglib动态代理--测试类 * @Author : myron * @Date : 2020-06-23 18:18 **/ public class CglibDynamicProxyTest { public static void main(String[] args) { Animal animal = new Animal(); CustomCglibMethodInterceptor interceptor = new CustomCglibMethodInterceptor(); Animal proxy = (Animal)interceptor.createProxy(animal); proxy.eat(); } }