Live2D

JDK 动态代理和 CGLIB 动态代理的区别是什么?

 


Java中实现动态代理有两种方式:JDK动态代理和CGLIB动态代理。动态代理的主要作用是在不改变原有代码的情况下,对原有代码进行增强。

JDK动态代理

JDK动态代理具体实现步骤:

  1. 创建一个接口。

  2. 实现接口。

  3. 创建一个实现InvocationHandler接口的类,重写invoke方法,该方法中的第一个参数是代理对象,第二个参数是被代理的方法对象,第三个参数是方法的参数数组。

  4. 通过Proxy类的newProxyInstance方法生成一个代理对象。

复制代码
public interface Subject {
    void hello(String param);
}

public class RealSubject implements Subject {
    @Override
    public void hello(String param) {
        System.out.println("hello " + param);
    }
}

public class MyInvocationHandler implements InvocationHandler {
    private Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before");
        Object result = method.invoke(target, args);
        System.out.println("after");
        return result;
    }
}

public class TestJDKDynamicProxy {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        MyInvocationHandler myInvocationHandler = new MyInvocationHandler(realSubject);
        Subject proxy = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),
                realSubject.getClass().getInterfaces(), myInvocationHandler);
        proxy.hello("world");
    }
}
复制代码

 

CGlib动态代理

利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理,但是不能对final修饰的类进行代理。

 

JDK动态代理和CGlib区别

它们的区别主要在以下几个方面:
  1. 实现方式:JDK 动态代理是通过反射实现的,而CGLIB动态代理是通过继承目标类来实现的。

  2. 目标类限制:JDK 动态代理要求目标类必须要实现接口,而CGLIB动态代理则没有这个限制。

  3. 性能:JDK 动态代理相对于 CGLIB 动态代理来说,因为实现方式不同,生成的代理类的效率会低一些。

  4. 对象类型:JDK 动态代理只能代理实现了接口的类,CGLIB 通过继承实现,不能代理 final 类。

  5. 依赖库:JDK 动态代理是 Java 自带的库,不需要额外的依赖,而 CGLIB 动态代理需要依赖 cglib 库。

在使用动态代理时,可以根据需要和具体的场景选择合适的实现方式,JDK 动态代理适用于接口代理的场景,而 CGLIB 动态代理适用于类代理的场景。

 

posted @   都是朕的江山  阅读(601)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
返回顶端
点击右上角即可分享
微信分享提示