动态代理学习记录

代理模式的概念:

动态代理:在程序执行过程中,用jdk的反射机制创建代理类对象,并动态指定要代理的目标类
可以在不改变原来目标方法功能的前提下,在代理中增强自己的功能代码 jdk动态代理,必须有接口,目标类必须实现接口,没有接口时用cglib
有A B C三个类,A不能直接访问C,A通过B访问C,B就是代理类

代理模式的作用:

1.功能增强:在你原有的功能上,增加了额外的功能,新增加的功能就叫功能增强
2.控制访问:代理类不让你访问目标 实现代理的方式:
1.静态代理:代理类是手工实现的,自己创建一个java类,表示代理类,同时你要代理的目标类是固定的 优点:实现简单,容易实现 缺点:目标类增加,代理类也要成倍增加,功能增加或修改,其他类也要跟着增加修改

2.jdk动态代理:用java反射包中的类和接口实现动态代理功能

反射包:java.lang.reflect 类:InvocationHandler,Method,Proxy
InvocationHandler接口:方法invoke():表示代理对象要执行的功能代码

Method类:表示方法,类中的方法。通过Method可以执行某个方法

创建代理类对象
		Test01 t1 = new Impl();
		通过Method执行say方法调用
		Method m1 = Test01.class.getMethod("say", String.class);
		invoke是Method类中的一个方法,表示执行方法的调用
		参数:Object 表示对象,要执行这个对象的方法  args:方法执行时的参数值
		m1.invoke(t1,"李四");

Proxy类:核心的对象,创建代理对象。之前创建对象都是new类,现在用proxy类代替new类

方法:静态方法 newProxyInstance()
作用:创建代理对象,等同于Taobao taobao = new Taobao();
参数:
1.ClassLoader类加载器,负责向内存中加载对象,用反射获取对象的ClassLoader,类a a.getClass().getClassLoader()
2.Class<?>[] interfaces接口,目标对象实现的接口,也是反射获取的
3.InvocationHandler h,自定义的代理类要完成的功能

实现动态代理的步骤:

1.创建接口,定义目标类要完成的功能
2.创建目标类实现接口
3.创建invocationHandler接口的实现类,在invoke方法中完成代理类的功能
调用目标方法
增强功能
4.用Proxy类的静态方法,创建代理对象,并把返回值转为接口类型

创建目标对象
			Sell f1 = new Factory1();
			
			创建InvocationHandler对象
			InvocationHandler handler = new SellHandler(f1);
			
			创建动态代理对象 强制转为接口类型
			Sell proxy = (Sell) Proxy.newProxyInstance(f1.getClass().getClassLoader(),f1.getClass().getInterfaces(),handler);
			
			通过动态代理对象执行方法
			Integer price = proxy.sell(1);

CGLib动态代理:cglib是第三方工具库,创建代理对象,要求目标类必须能被继承,不能是final的类,方法也不能为static

工具类		Enhancer en = new Enhancer():完成子类代理对象的创建
			en.setSuperclass(target,getClass());设置父类
			en.setCallback(this);设置回调函数
			return en.create();返回子类代理对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值