Java的代理

1概念
是一种设计模式,允许你为某个目标对象提供一个替身,以控制对该对象的访问(客户-秘书-老板),可以用于延迟加载,访问控制,日志记录,事务管理等。
1.1静态代理
静态代理在编译时就创建代理类,需要代理类和目标类实现相同的接口。(提前就写好程序)缺点是一个接口的目标类就需要一个代理类,比较冗余,无法动态代理所有方法(需要自己一个个实现)。
1.2动态代理
1.2.1jdk动态代理
在运行时创建代理类,要求代理的类必须实现一个或者多个接口,并通过java.lang.reflect.Proxy和InvocationHandler接口来创建动态代理的实例,在类本身调用其他方式方法时不会再次走代理。
1.2.2cglib动态代理
在运行时创建代理类,不同于jdk代理的是,不需要实现接口,而是通过生成子类来实现代理,通过invokeSuper调用目标类的方法,在目标类中调用本类方法会再一次代理(调用的时父类的方法,而子类实现了父类,所以再一次代理,常用的springAOP用的就是这个),通过invoke调用目标类的方法,在目标类调用本地方法不会再次代理(调用的是子类的方法)。
区别列表
1.jdk动态代理只能代理接口,目标类必须实现一个或多个接口。cglib动态代理是通过继承目标类的方式来实现的。
2.jdk动态代理会在运行时创建一个$Porxy*.class的代理类,cglib是采用ASM第三方组件来生成多个(3)目标类的子类。
3.jdk动态代理是实现的接口的所有方法,如果目标类没有实现接口则无法使用jdk。cglib是重写了目标类类的所有方法。
4.jdk动态代理先调用代理类进行增强,再通过反射调用目标类的方法。cglib先通过代理类进行增强然后使用superInvoke调用父类的方法,每一次都走代理类,使用Invoke的话,第一次走代理类,后面直接走之类的方法。
5.性能方面,jdk8之前cglib快,1.8之后效率差不多。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值