动态代理两种实现以及差异性

tech2026-08-07  1

为什么要使用动态代理,学习一个新的东西之前,我们先聊可他的必要性

答曰:再不修改原有的逻辑条件下,能够对代码进行业务的增强操作。

Java动态代理核心:InvocationHandler和Proxy

实现的步骤:

实现接口InvocationHandler并实现invoke方法。创建Proxy.newProxyInstance方法,该方法三个参数:ClassLoad,Class<?>[], InvocationHandler将第一步实现InvocationHandler的方法作为参数传入到Proxy.newProxyInstance中去 public class JdkProxy implements InvocationHandler { private final Object target; public JdkProxy(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("调用之前添加的操作"); Object result = method.invoke(target, args); System.out.println("调用之后的操作"); return result; } public static Object getInstance(Object object){ return Proxy.newProxyInstance( object.getClass().getClassLoader(), object.getClass().getInterfaces(), new JdkProxy(object) ); } }

Cglib两个核心:MethodInterceptor和Enhancer

实现的步骤

定义一个类实现MethodInterceptor接口,重写intercept接口新增Enhancer对象,设置方法 类加载器: enhancer.setClassLoader(clazz.getClassLoader());设置被代理类 enhancer.setSuperclass(clazz);设置方法拦截起 enhancer.setCallback(new DebugMethodInterceptor()); public class DebugMethodInterceptor implements MethodInterceptor { @Override public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("拦截方法开始"); Object object = methodProxy.invokeSuper(o, args); System.out.println("拦截方法结束"); return object; } }

二者的区别

jdk动态代理代理的类必须实现了接口,而cglib的代理可以不用实现接口,只要是类即可。效率jdk的效率会更高一些。
最新回复(0)