4-代理模式-静动详细描述

本文深入解析Java中的静态代理与动态代理的区别,重点介绍动态代理的实现机制,包括使用InvocationHandler接口和Proxy类的方法,以及如何在运行时动态生成代理类。

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

1.静动区别:

在静态代理中(Static Proxy),代理类是真实存在的,代理类在每次编译的时候都会生成一个.class字节码文件,所以说静态类所实现的接口和代理方法在编译的时候已经定好了
动态代理(Dynamic Proxy),动态的加载生成.class文件,在系统运行时动态的生成和加载
优点:无需为每个真实角色来创建一个形式完全一样的代理类,假如抽象接口中存在多个抽象方法,为每个方法写一个代理方法是很麻烦和消耗资源的,同样,我们后期的接口的改动和代码维护成本会大大增加,而且在动态代理中,一个代理角色代理多个真实角色,并代理多个方法

2.Java中的动态代理:

从JDK1.3开始,java就对动态代理提供了支持,在动态代理的机制中,需要利用lang包下的反射-java.lang.reflect中的InvocationHandler接口和Proxy

首先我们的handler要去是实现InvocationHandler接口,并实现中的invoke方法

 public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;

最重要的就是这个方法,它是用来处理代理类实例的方法调用并返回结果,当一个代理实例中的业务方法被调用时将自动调用该方法,proxy表示代理类的实例,method表示需要代理的方法,args表示代理方法的参数数组

Proxy
proxy中有四个静态方法
//返回知道代理实例的调用处理程序
static InvocationHandler getInvocationHandler(Object proxy)

//返回代理类的Class对象,并向其提供类加载器和接口数组
static Class<?> getProxyClass(ClassLoader loader ,Class<?>[]interfaces)

//当且仅当指定的类通过getProxyClass 方法或 newProxyInstance 方法动态生产代理类时,返回true
static boolean isProxyClass(Class<?> cl)

//返回一个接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序
//方法中ClassLoader loader 参数用来指定动态代理类的类加载器,Class<?>[]interfaces 用来指定代理类要实现的接口
//InvocationHandler h 用来指定与即将生成的动态代理对象相关联的调用程序
static Object newProxyInstance(ClassLoader loader,Class<?> interfaces ,InvocationHandler h)
相关代码在github中:https://github.com/zmj1314521/zmj.git
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值