type
Post
status
Published
date
Mar 11, 2023
slug
summary
emmm chatGPT turbo生成
tags
Java
category
笔记
icon
password
Java 动态代理一般分为 JDK 动态代理和 CGLIB 动态代理,二者的区别如下:
  1. JDK 动态代理是基于接口的代理,只能代理实现了接口的类,而 CGLIB 动态代理是基于继承的代理,可以代理未实现接口的类。
  1. JDK 动态代理生成的代理对象性能较低,因为每次生成代理对象时都需要通过反射来进行,而 CGLIB 动态代理在生成代理对象时会使用代码生成技术,性能更高。
以下是 JDK 动态代理和 CGLIB 动态代理的代码实现:
JDK 动态代理:
public interface Subject { void request(); } public class RealSubject implements Subject { @Override public void request() { System.out.println("RealSubject is running..."); } } public class JDKProxyHandler implements InvocationHandler { private Object target; public JDKProxyHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("JDKProxyHandler is running..."); Object result = method.invoke(target, args); return result; } } public class ProxyTest { public static void main(String[] args) { RealSubject realSubject = new RealSubject(); Subject proxySubject = (Subject) Proxy.newProxyInstance( realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), new JDKProxyHandler(realSubject) ); proxySubject.request(); } }
CGLIB 动态代理:
public class RealSubject { public void request() { System.out.println("RealSubject is running..."); } } public class CGLIBProxyHandler implements MethodInterceptor { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("CGLIBProxyHandler is running..."); Object result = methodProxy.invokeSuper(o, objects); return result; } } public class ProxyTest { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(RealSubject.class); enhancer.setCallback(new CGLIBProxyHandler()); RealSubject proxySubject = (RealSubject) enhancer.create(); proxySubject.request(); } }
 
彻底弄懂Redis的内存淘汰策略Spring循环依赖