java动态代理两种实现方式

本文详细介绍了两种动态代理技术:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,适用于有接口的场景;CGLIB则采用字节码增强技术,对指定类生成子类并进行方法拦截,适用于没有接口的场景。文章提供了具体的代码实例,展示了如何使用这两种代理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、JDK动态代理

JDK的动态代理基于接口实现,所以被代理类一定要有实现接口

public interface IJDKTestDemo {
    String getTopic(String prefix);
}

/**
 * 功能描述:被代理类
 */
public class JDKTestDemoImpl implements IJDKTestDemo {
    @Override
    public String getTopic(String prefix) {
        return "Hello " + prefix + "!";
    }
}

代理类通过实现InvocationHandler

public class ProxyClass implements InvocationHandler {

    private Object object;

    public ProxyClass(Object object) {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("jdk proxy start...." + System.currentTimeMillis());
        Object returnValue = method.invoke(object, args);
        System.out.println("proxy result:" + returnValue);
        System.out.println("jdk proxy end...." + System.currentTimeMillis());
        return returnValue;
    }
}

代理生成工厂

public class JDKProxyFactory {
    public static <T> T getInstants(T obj) {
        return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new ProxyClass(obj));
    }
}

二、CGLIB

需要引入jar

<dependency>
  <groupId>cglib</groupId>
  <artifactId>cglib</artifactId>
</dependency>

代理类需要实现MethodInterceptor

public class CGLIBProxy<T> implements MethodInterceptor {

    private Class<T> clazz;

    public CGLIBProxy(Class<T> c) {
        this.clazz = c;
    }

    public T createProxy() {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return (T) enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("cglib proxy start...." + System.currentTimeMillis());
        Object returnValue = methodProxy.invokeSuper(o, args);
        System.out.println("proxy result:" + returnValue);
        System.out.println("cglib proxy end...." + System.currentTimeMillis());
        return returnValue;
    }
}
/**
 * 功能描述:cglib动态代理工厂
 */
public class CGLIBProxyFactory {
    public static <T> T getInstants(Class<T> clazz) {
        return new CGLIBProxy<>(clazz).createProxy();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值