概述
JDK的动态代理
1 package com.haifei.proxy.jdk; 2 3 /** 4 * 目标类接口 5 */ 6 public interface TargetInterface { 7 8 public void save(); 9 10 }
1 package com.haifei.proxy.jdk; 2 3 /** 4 * 目标类 5 */ 6 public class Target implements TargetInterface{ 7 8 @Override 9 public void save() { 10 System.out.println("save running..."); 11 } 12 13 }
1 package com.haifei.proxy.jdk; 2 3 /** 4 * 增强类 5 */ 6 public class Advice { 7 8 public void before(){ 9 System.out.println("前置增强。。。"); 10 } 11 12 public void after(){ 13 System.out.println("后置增强。。。"); 14 } 15 16 }
1 package com.haifei.proxy.jdk; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 import java.lang.reflect.Proxy; 6 7 /** 8 * JDK 的动态代理-测试类 9 * 10 * 动态代理参考: 11 * JavaWeb19.6【Filter&Listener:利用设计模式之代理模式增强对象的功能】 12 * https://www.cnblogs.com/yppah/p/14974136.html 13 */ 14 public class ProxyTest { 15 16 public static void main(String[] args) { 17 //目标对象 18 final Target target = new Target(); 19 //增强对象 20 final Advice advice = new Advice(); 21 22 //获取动态生成的代理对象 23 TargetInterface proxy = (TargetInterface)Proxy.newProxyInstance( 24 target.getClass().getClassLoader(), //目标对象类加载器 25 target.getClass().getInterfaces(), //目标对象相同的接口字节码对象数组 26 new InvocationHandler() { 27 //调用代理对象的任何方法 实质执行的都是invoke方法 28 @Override 29 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 30 advice.before(); //前置增强 31 Object invoke = method.invoke(target, args); //执行目标方法 32 advice.after(); //后置增强 33 return invoke; 34 } 35 } 36 ); 37 38 //调用代理对象的方法 39 proxy.save(); 40 } 41 /* 42 前置增强。。。 43 save running... 44 后置增强。。。 45 */ 46 47 }
cglib动态代理