代理

一、前言

代理:

应用场景:

1、更方便的调用真实业务实现者;

2、在不破坏原业务逻辑的前提下,对既有功能实现的增强;

代理模式:基本上有Subject角色,RealSubject角色,Proxy角色。其中:

Subject角色负责定义RealSubject和Proxy角色应该实现的接口;

RealSubject角色用来真正完成业务服务功能;

Proxy角色负责将自身的Request请求,调用realsubject 对应的request功能来实现业务功能,自己不真正做业务。

静态代理

这种静态的代理模式固然在访问无法访问的资源,增强现有的接口业务功能方面有很大的优点,但是大量使用这种静态代理,会使我们系统内的类的规模增大,并且不易维护;

并且由于Proxy和RealSubject的功能 本质上是相同的,Proxy只是起到了中介的作用,这种代理在系统中的存在,导致系统结构比较臃肿和松散。

动态代理:是指在运行期动态的为指定的类生成其代理类。(需要相关的运行时编译技术)

具体技术:JDK动态代理,CGLIB(Code Generation Library)、Javassist、ASM、BCEL、SERP。

JDK动态代理:特点,基于接口实现;

CGLIB:特点,基于类继承实现;它可以在运行期扩展Java类与实现Java接口

Javassist:Javassist是一个运行时编译库,他能动态的生成或修改类的字节码,类似的有ASM和CGLIB,大多数框架就是基于后者实现的。

二、概念

  ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,

也可以在类被加载入Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里,

这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。

ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。

asm字节码增强技术主要是用来反射的时候提升性能的,如果单纯用jdk的反射调用,性能是非常低下的,

而使用字节码增强技术后反射调用的时间已经基本可以与直接调用相当了。

参考资料

官网

Java字节码操纵框架ASM小试

关于java字节码框架ASM的学习

使用ASM操作Java字节码,实现AOP原理

Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

asm 动态代理的例子

关于java字节码框架ASM的学习

ASM 5.0.3 主要类的关系和简单实例

ASM第一篇【HelloWorld】

深入字节码 -- 使用 ASM 实现 AOP

深入字节码 -- 玩转 ASM-Bytecode

深入ASM源码之ClassReader、ClassVisitor、ClassWriter

原文地址:https://www.cnblogs.com/wangwangfei/p/7219105.html