AOP底层原理分析

本文详细介绍了如何使用JDK动态代理在有接口的情况下创建代理对象,通过newProxyInstance方法配置代理逻辑,实现方法拦截与增强。重点讲解了代理对象如何通过InvocationHandler间接调用真实对象的方法并进行定制操作。

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

  1. 动态代理
    1.1 有接口的情况
    有接口时,使用JDK动态代理。使用Proxy类里面的newProxyInstance创建代理对象。
public class JDKProxy {
 	public static void main(String[] args) {
 	//创建接口实现类代理对象
 		Class[] interfaces = {UserDao.class};
 		UserDao user = (UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, 
 		new InvocationHandler() {
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) 
			throws Throwable {
				return null;
			}
 		});
 		user.display();
	}
}

newProxyInstance方法包含三个参数:
loader:加载真实对象的类加载器(不过也有使用JDKProxy.class.getClassLoader()的,不知为何也能成功);
interfaces:真实对象已经实现了的所有接口组成的数组;
h:实现的InvocationHandler请求处理程序就是写增强方法的代理逻辑。

执行过程:当代理对象(user)调用方法(display)时,会调用代理逻辑中的invoke函数,并把自身作为proxy参数,把代理对象调用的方法作为method参数,代理对象调用方法的参数作为args,一起给传入代理逻辑类AdvertisementLogic中的invoke()方法里作为参数,这样,在invoke()方法里,就能够通过反射调用到真实对象的真实方法(method.invoke(dlrb,args)),并且在调用真实方法前后可以加入一些其他的控制逻辑。

真正实现代理逻辑的是代理逻辑类,当代理对象的方法被调用时,【代理对象】并不直接调用【真实对象】,而是直接调用【代理逻辑类】并传给它需要的参数,由【代理逻辑类】来实现真正的代理逻辑,而【代理逻辑类】不仅可以执行自己的代理逻辑,还可以随时调用【真实对象】的方法,从而完成了整个的代理。因此,热巴小姐姐如果需要【拍电视剧】的话,我们只要在去实现一个【拍电视剧】的【代理逻辑类】就好了,最后把它交给JDK的动态代理方法【Proxy.newProxyInstance()】就好了。

参考博文:

  1. https://blog.youkuaiyun.com/qq_19782019/article/details/83277344
  2. 尚硅谷spring5
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值