JAVA代理

本文详细介绍了三种代理模式:静态代理、JDK动态代理和Cglib动态代理。通过具体实例展示了每种代理模式的工作原理和使用场景,帮助读者理解并掌握代理模式在实际项目中的应用。

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

1.静态代理:代理类和被代理类继承同一个接口

被代理类:

public class IUserDao implements UserDao {
    @Override
    public void save() {
        System.out.println("-------IUser 保存--------");
    }
}

代理类:

public class StaticProxy implements UserDao{
    private UserDao dao;
    public StaticProxy(UserDao dao){
        this.dao=dao;
    }
    @Override
    public void save() {
        System.out.println("静态代理开始");
        dao.save();
        System.out.println("静态代理结束");
    }
}

测试:

 public static void main(String[] args) {
        IUserDao dao = new IUserDao();
        StaticProxy proxy = new StaticProxy(dao);
        proxy.save();
    }

输出结果:静态代理开始
-------IUser 保存--------
静态代理结束

2.JDK动态代理:JDK的动态代理只能依靠接口实现,因为jdk重新封装的代理类继承了Proxy类。java单继承多实现

被代理类:

public class IUserService implements UserService,UserService2 {
    @Override
    public void save() {
        System.out.println("IUserService save");
    }

    @Override
    public void save2() {
        System.out.println("IUserService save2");
    }
}

处理类:

public class ProxyInvocationHandler implements InvocationHandler {
    private Object target;
    public ProxyInvocationHandler(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 null;
    }
}

测试:

  public static void main(String[] args) {
        //创建动态代理
        ClassLoader classLoader = new IUserService().getClass().getClassLoader();//类加载器
        Class<?>[] interfaces = new IUserService().getClass().getInterfaces();//对象所实现的接口
        InvocationHandler handler = new ProxyInvocationHandler(new IUserService());//创造一个代理类的实例
        Object proxy = Proxy.newProxyInstance(classLoader,interfaces,handler);
        UserService userServiceProxy = (UserService)proxy;
        userServiceProxy.save();
    }

返回结果:----------开始代理------------
IUserService save
----------代理结束---------

3.Cglib动态代理:

被代理类:

public class UserService  {
    public void save(){
        System.out.println("useservice save");
    }
    public void save2(){
        System.out.println("userservice save2");
    }
}

代理拦截器:

public class CGlibProxy implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("--------cglib before-------");
        methodProxy.invokeSuper(o,objects);
        System.out.println("--------cglib after-------");
        return null;
    }
}

测试:

 public static void main(String[] args) {
        Class userClass = new UserService().getClass();//代理类class
        Enhancer enhancer = new Enhancer();//
        enhancer.setSuperclass(userClass);
        enhancer.setCallback(new CGlibProxy());
        UserService service =  (UserService)enhancer.create();
        service.save();
    }

输出:--------cglib before-------
useservice save
--------cglib after-------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值