JDK 动态代理详解

什么是动态代理

在不改变原始类代码的情况下,实现原始类功能的增强

动态代理java23设计模式里的一种,也称代理模式,也是开发中经常用到的设计模式。

如何使用动态代理

Proxy类是jdk提供的代理类基于接口的,常用newProxyInstance方法如下:

public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)
        throws IllegalArgumentException{
	...省略实现...
}
    

newProxyInstance方法有三个参数

  • ClassLoader loader:被代理类的类加载器
  • Class<?>[] interfaces:被代理类的实现的所有接口列表
  • InvocationHandler h:通知原始类调用

动态代理使用场景

动态代理最常用的一个应用场景就是,在业务系统中开发一些非功能性需求,比如:监控、统计、鉴权、限流、事务、幂等、日志。我们将这些附加功能与业务功能解耦,放到代理类中统一处理,让程序员只需要关注业务方面的开发。经常用到的Spring AOP原理就是基于动态代理的。

实例

创建一个接口,如下

public interface ILandlord {
    //卖房
    public void sell();
}

创建Landlord实现ILandlord接口

/**
 *  房东
 */
public class Landlord implements ILandlord {

    @Override
    public void sell() {
        System.out.println("=======我是房东,开始卖房子=======");
        System.out.println("=======房东跟客户签合同中=======");
    }
}

创建代理类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理类(中介)
 */
public class Agent {
    /**
     * 中介代理房东卖房,真正签合同的还是房东
     */
    public static void main(String[] args) {
        //房东
        Landlord landlord = new Landlord();
        //被代理类的类加载器
        ClassLoader classLoader = landlord.getClass().getClassLoader();
        //被代理类实现的所有接口
        Class<?>[] interfaces = landlord.getClass().getInterfaces();
        ILandlord proxy = (ILandlord) Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("我是中介,代理房东卖房子");
                //中介只是代理房东卖房,真正跟客户签合同的是房东,因此是method.invoke(landlord,args),而不是method.invoke(proxy,args)
                return method.invoke(landlord,args);
            }
        });
        //中介卖房
        proxy.sell();

    }
}

我们可以把代理类理解为中介,被代理类理解为房东。一般情况下,房东没有渠道卖房,也比较忙,会去找中介代理卖房,当中介跟客户谈好价格后,中介喊房东签合同即可,也不影响房东原有的事情,还能卖房。

开心一刻

夫妻两人逛商场,老婆看中了好几件衣服,要买。
老公看到这架势,要花不少钱啊,于是问道:
“不是说只逛逛吗,怎么还真买啊。”
老婆怒道:“昨晚谁说的只抱抱来着,可结果呢。”
在这里插入图片描述

如果觉得不错,帮忙点个赞,您的点赞将是我的动力!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值