Java代理

一、概述
代理(Proxy)是一种设计模式,间接访问目标对象的访问方式,代理就是类似一个中介的角色。可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
现实中的例子:明星(被代理对象)和经纪人(代理),商家都是联系经纪人, 而不是直接联系明星。明星只是负责表演,唱歌,而经纪人是直接与商家对话,然后让明星干.....(调用被代理对象的方法)


二、分类
2.1静态代理
 
静态代理使用时,需要定义公共接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类。(上图已经很简单明了了)

优点:
1、访问对象时引入一定程度的间接性。
2、可以对目标功能进行扩展,附加多种用途
缺点:
因为代理对象需要与目标对象实现一样的接口,一旦接口增加新方法,目标对象与代理对象都要进行修改。如果代理对象很多,实现起来就更加麻烦了。


2.2动态代理
可以用来解决静态代理中的缺点。


动态代理也叫做:JDK代理,接口代理
动态代理有以下特点:
1.代理对象不需要实现接口 (目标对象要不要实现接口呢?这个注意下,下面会讲)
2.代理对象的生成,是利用JDK的API,动态在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)


JDK中生成代理对象的API
代理类所在包:java.lang.reflect.Proxy


JDK实现代理只需要使用newProxyInstance方法,下面为源码声明
public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)


源码中的说明
* @param   loader the class loader to define the proxy class
* @param   interfaces the list of interfaces for the proxy class
*          to implement
* @param   h the invocation handler to dispatch method invocations to
该方法是在Proxy类中是静态方法,且接收的三个参数依次为:


ClassLoader loader:指定当前目标对象使用类加载器,获取加载器的方法是固定的
Class[] interfaces:目标对象实现的接口的类型,使用泛型方式确认类型
InvocationHandler h:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入


JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口,如果想代理没有实现接口的类,就可以使用CGLIB代理实现.


2.3 CGLIB代理
静态代理和动态代理模式都是要求目标对象实现一个接口,但有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候就可以使用以目标对象子类的方式类实现代理,这种方法就叫做: CGLIB代理。(代码生成库)


CGLIB是一个强大的高性能的代码生成包,它可以在运行期扩展Java类与实现Java接口。
CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM来转换字节码并生成新的类.不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。


CGLIB子类代理实现方法:
1.需要引入CGLIB的jar文件,但是Spring的核心包中已经包括了CGLIB功能,所以直接引入spring-core-*.jar即可.
2.引入功能包后,就可以在内存中动态构建子类
3.代理的类不能为final,否则报错(因为final类无子类)
4.目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法.


在Spring的AOP编程中:
如果加入容器的目标对象有实现接口,用JDK代理.
如果目标对象没有实现接口,用CGLIB代理.


参考:cnblogs.com/cenyu/p/6289209.html
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值