首页 > 其他分享 >DK 动态代理和 CGLIB 动态代理的区别是什么?

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

时间:2023-03-03 17:33:19浏览次数:34  
标签:DK JDK Object 代理 CGLIB 动态 public

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 动态代理适用于类代理的场景。

 

标签:DK,JDK,Object,代理,CGLIB,动态,public
From: https://www.cnblogs.com/galo/p/17176425.html

相关文章