动态代理(JDKCGLIB)

    科技2025-07-10  19

    文章目录

    1.静态代理2.jdk动态代理3. CGLIB动态代理

    1.静态代理

    //接口 public interface Speaker { public void speak(); } //被代理人张三 public class ZhangSan implements Speaker{ @Override public void speak() { System.out.println("夫妻感情破裂"); } } //代理类律师 public class ZhangSanLawyer implements Speaker{ ZhangSan zhangSan = new ZhangSan(); @Override public void speak() { System.out.println("引用法律条文"); zhangSan.speak(); System.out.println("道德层面批评"); } } //测试类 public class test { public static void main(String[] args) { Speaker speaker = new ZhangSanLawyer(); speaker.speak(); } }

    2.jdk动态代理

    因为上面是静态代理,是在编译时期就得为每个人指定它的代理律师,所以需要每一个人都需要自己的类,比如说zhangsan这个类,每个人都需要自己对应的代理律师类,比如说上面的ZhangSanLawyer。 动态代理是指在java运行期间创建动态代理类,而不是向上面一样在编译期间指定编码静态代理类 首先把律师行为抽象出来,抽象代理对象行为 invoke注入被代理类的所有方法,对这些方法进行扩充

    public class LawyerProxy implements InvocationHandler { private Object obj; public LawyerProxy(Object obj) { this.obj = obj; }

    @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getName().equals(“speak”)) { System.out.println(“引用法律条文”); method.invoke(obj,args); System.out.println(“道德层面批评”); } return null; } }

    测试类 public class test { public static void main(String[] args) { //静态代理 Speaker speaker = new ZhangSanLawyer(); speaker.speak(); //动态代理 LawyerProxy lawyerProxy = new LawyerProxy(new ZhangSan());//抽象代理对象行为 //下面用到Speaker接口,也就是说jdk实现动态代理需要被代理类有实现接口 Speaker speaker1 = (Speaker) Proxy.newProxyInstance(test.class.getClassLoader(),new Class[]{Speaker.class},lawyerProxy); speaker1.speak();

    } }

    3. CGLIB动态代理

    CGLIB动态代理不需要本体实现接口,是jdk动态代理的补充

    下面李四本体没有实现接口

    public class Lisi { public void speak() { System.out.println("李四说: 夫妻情感破裂"); } } public class LawyerInteceptor implements MethodInterceptor { private Object obj; public LawyerInteceptor(Object obj) { this.obj = obj; } @Override //回调方法 public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { if(method.getName().equals("speak")) { System.out.println("引用法律条文"); method.invoke(obj,args); System.out.println("道德层面批评"); } return null; } public class test { public static void main(String[] args) { //静态代理 Speaker speaker = new ZhangSanLawyer(); speaker.speak(); //动态代理 LawyerProxy lawyerProxy = new LawyerProxy(new ZhangSan());//抽象代理对象行为 Speaker speaker1 = (Speaker) Proxy.newProxyInstance(test.class.getClassLoader(),new Class[]{Speaker.class},lawyerProxy); speaker1.speak(); LawyerInteceptor lawyerInteceptor = new LawyerInteceptor(new Lisi());//抽象代理对象行为 Lisi lisi = (Lisi)Enhancer.create(Lisi.class,lawyerInteceptor); lisi.speak(); } }
    Processed: 0.026, SQL: 8