一篇文章讲清楚Java动态代理

Java动态代理概述

首先我们解释一下代理是什么意思,大家的微信里有很多做微商的朋友。很多微商的销售模式就是代理模式。比如店主小二在微信朋友圈卖衣服,小王看到了小二发的朋友圈就找小二买衣服,而小二只是一个代理商,它的衣服是从小一那里拿的。

在这个过程中小二就是小一的代理,代理对卖衣服这个行为进行的增强,把原来10块钱一件的衣服卖到了20块,并且购买成功还赠送小礼品。

在这里插入图片描述

Java动态代理指的是在程序运行时,为已有对象生成代理对象,对原有对象的方法进行功能增强。

目标接口和实现类

JDK动态代理要求目标类(被代理的类)必须实现一个接口。如下面的TestDaoImpl类是实现了TestDao接口,这样TestDaoImpl就可以成为动态代理的目标类。

public interface TestDao {
    public void save();
    public void delete();
    public void update();
}

public class TestDaoImpl implements TestDao {
    @Override
    public void save() {
        System.out.println("保存");
    }

    @Override
    public void delete() {
        System.out.println("删除");
    }

    @Override
    public void update() {
        System.out.println("修改");
    }
}

目标接口功能增强的处理器

JDK提供了一个InvocationHandler接口和一个Proxy类。Proxy类用于为TestDao的实现类生成代理对象,InvocationHandler用于处理代理对象调用方法时如何进行功能增强。

public class TestDaoHandler implements InvocationHandler {
    TestDao testDao;
    public TestDaoHandler(TestDao testDao) {
        this.testDao = testDao;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("执行"+method.getName()+"方法功能增强");
        //执行目标方法
        Object obj = method.invoke(testDao,args);
        System.out.println("执行"+method.getName()+"方法后功能增强\n");
        //返回方法的结果
        return obj;
    }
}

生成代理对象

写一个测试类,生成动态代理对象并执行方法,观察方法进功能是否有增强。

public class JDKDynamicProxyDemo {
    public static void main(String[] args) {
        //1.创建目标对象
        TestDao testDao=new TestDaoImpl();
        //2.创建TestDao的功能增强处理器
        TestDaoHandler handler=new TestDaoHandler(testDao);
        //3.为TestDao创建代理对象
        TestDao testDaoProxy = (TestDao) Proxy.newProxyInstance(
                ClassLoader.getSystemClassLoader(),
                testDao.getClass().getInterfaces(),
                handler);
        //4.使用代理对象调用save
        testDaoProxy.save();
        testDaoProxy.delete();
        testDaoProxy.update();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值