ICode9

精准搜索请尝试: 精确搜索

Java代理模型

2019-10-14 22:58:10??阅读:12??来源: 互联网

标签:Java?对象?模型?代理?接口?目标?CGLib?final


引用文章 https://www.cnblogs.com/boboxing/p/8126046.html

代理模式是什么

代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展。

?

代理的作用在于不修改目标代码的情况下,可以控制对目标的访问,可以在其前后加上自己的业务处理代码,甚至阻止对目标方法的访问,有点类似于过滤器和拦截器的作用。

?

代理模式

  • 静态代理
    • 继承? ? ? ?代理对象继承目标对象,重写增强方法? ?缺点:会产生代理类过多、非常复杂
    • 聚合目标对象和代理对象实现同一接口,代理对象当中要包含目标对象? 缺点:也会产生类爆炸,只是比继承少一点点

?

     总结: 如果在不确定的情况下,不要去使用静态代理,一代写代码就会产生类,一旦产生类就会爆炸。

?

  • 动态代理  

1.JDK动态代理

    • 调用Proxy类的静态方法newProxyInstance即可,该方法会返回代理类对象

static Object newProxyInstance(ClassLoader loader, Class[] interfaces,InvocationHandler h )
接收的三个参数依次为:
  • ClassLoader loader:指定当前目标对象使用类加载器,写法固定
  • Class[] interfaces:目标对象实现的接口的类型,写法固定
  • InvocationHandler h:事件处理接口,需传入一个实现类,一般直接使用匿名内部类

生产的代理类 $Proxy0 extends Proxy implements targerInterface?

2.CGLib动态代理

原理:使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理。唯一需要注意的是?CGLib不能对声明为final的方法进行代理 ,因为CGLib原理是动态生成被代理类的子类。 详细分析引用:https://www.cnblogs.com/monkey0307/p/8328821.html

前提条件:

  • 需要引入cglib的jar文件,由于Spring的核心包中已经包括了Cglib功能,所以也可以直接引入spring-core-3.2.5.jar
  • 目标类不能为final
  • 目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法

?



标签:Java,对象,模型,代理,接口,目标,CGLib,final

专注分享技术,共同学习,共同进步。侵权联系[admin#icode9.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有