Skip to content

ByteBuddy实现动态代理

Byte Buddy - runtime code generation for the Java virtual machine

CGLIB已经不维护了,建议使用ByteBuddy。

java
<dependency>
  <groupId>net.bytebuddy</groupId>
  <artifactId>byte-buddy</artifactId>
  <version>LATEST</version>
</dependency>
java
public class ProxyResolver {

    ByteBuddy byteBuddy = new ByteBuddy();

    /**
     * 通过字节码技术对原始Bean进行增强。
     *
     * @param bean    原始Bean
     * @param handler 代理拦截器
     * @param <T>
     * @return
     */
    public <T> T createProxy(T bean, InvocationHandler handler) {
        Class<?> targetClass = bean.getClass();
        //动态创建Proxy类
        Class<?> proxyClass = this.byteBuddy
                //子类用默认无参构造方法
                .subclass(targetClass, ConstructorStrategy.Default.DEFAULT_CONSTRUCTOR)
                //拦截所有public方法
                .method(ElementMatchers.isPublic())
                .intercept(InvocationHandlerAdapter.of(new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //需要代理的bean,调用InvocationHandler的代理逻辑
                        return handler.invoke(bean, method, args);
                    }
                }))
                //生成字节码
                .make()
                //加载字节码
                .load(targetClass.getClassLoader()).getLoaded();
        Object proxy;
        try {
            //根据无参构造生成目标类的子类
            proxy = proxyClass.getConstructor().newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return (T) proxy;
    }

}