Java中实现动态代理有两种方式:JDK动态代理和CGLIB动态代理。动态代理的主要作用是在不改变原有代码的情况下,对原有代码进行增强。
JDK动态代理
JDK动态代理具体实现步骤:
-
创建一个接口。
-
实现接口。
-
创建一个实现InvocationHandler接口的类,重写invoke方法,该方法中的第一个参数是代理对象,第二个参数是被代理的方法对象,第三个参数是方法的参数数组。
-
通过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区别
它们的区别主要在以下几个方面:-
实现方式:JDK 动态代理是通过反射实现的,而CGLIB动态代理是通过继承目标类来实现的。
-
目标类限制:JDK 动态代理要求目标类必须要实现接口,而CGLIB动态代理则没有这个限制。
-
性能:JDK 动态代理相对于 CGLIB 动态代理来说,因为实现方式不同,生成的代理类的效率会低一些。
-
对象类型:JDK 动态代理只能代理实现了接口的类,CGLIB 通过继承实现,不能代理 final 类。
-
依赖库:JDK 动态代理是 Java 自带的库,不需要额外的依赖,而 CGLIB 动态代理需要依赖 cglib 库。
在使用动态代理时,可以根据需要和具体的场景选择合适的实现方式,JDK 动态代理适用于接口代理的场景,而 CGLIB 动态代理适用于类代理的场景。
标签:DK,JDK,Object,代理,CGLIB,动态,public From: https://www.cnblogs.com/galo/p/17176425.html