spirng framework源码解析之spring-core-asm包(五)

412 阅读2分钟

这是我参与8月更文挑战的第五天,活动详情查看:8月更文挑战

功能介绍

一句话来说就是主要是对字节码的一些处理。

源码解析

// 访问java 注解的一个抽象类,并规定访问顺序必须为visit、visitEnum、visitAnnotation、visitArray、visitEnd
public abstract class AnnotationVisitor {}

// 根据java虚拟机的规范生成相应的结构类
final class AnnotationWriter extends AnnotationVisitor {}

// Java虚拟机中定义的非标准类、字段、方法或代码属性规范
public class Attribute {}

// 动态扩展vector,与字节输出流类似,单其效率更高,其中putUTF8方法若参数为utf8的字符串,其长度的要求为65535
public class ByteVector {}

// 读取class文件的一个类
public class ClassReader {}

// 操作class文件时,过大异常类要求为 < 65535
public final class ClassTooLargeException extends IndexOutOfBoundsException {}

// 访问class的抽象类,并规定顺序visit、visitSource、visitModule、visitNestHost、
// visitOuterClass、visitAnnotation、visitTypeAnnotation、visitAttribute、visitNestMember..
public abstract class ClassVisitor {}

// 访问class的具体实现类
public class ClassWriter extends ClassVisitor {}

// 用该类下的bootstrap方法,在运行期间计算常量,好像是java11才支持的
public final class ConstantDynamic {}

// 定义额外的常量
final class Constants {}

// 根据ClassReader解析后,定义接收的属性
final class Context {}

// 当前指令的输入堆栈映射帧的信息,并重写父类的execute方法
final class CurrentFrame extends Frame {}

// 对前置和后置进行处理包括什么异常的
final class Edge {}

// 访问字段的抽象类,并规定调用顺序
public abstract class FieldVisitor {}

// 访问字段并进行操作
final class FieldWriter extends FieldVisitor {}

// 输入堆栈映射帧的信息
class Frame {}

// 对字段或方法的引用
public final class Handle {}

// 对异常处理的工具类
final class Handler {}

// 介于方法和字节码中间,用于跳转、切换指令和try catch
public class Label {}

// 对方法进行操作,code > 65535,抛出该异常
public final class MethodTooLargeException extends IndexOutOfBoundsException {}

// 访问方法的抽象类,并规定调用顺序
public abstract class MethodVisitor {}

// 对方法的具体操作类
final class MethodWriter extends MethodVisitor {}

// 访问模块的抽象类,并规定调用顺序,模块是java9的新特性,就是代码和数据的封装体
public abstract class ModuleVisitor {}

// 对模块的具体操作类
final class ModuleWriter extends ModuleVisitor {}

// 定义jvm Opcodes, 访问标识和数组类型的codes,参见:
[JVMS 6](https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-6.html)
public interface Opcodes {}

// 访问RecoredComponent的抽象类,并规定其调用顺序,RecoredComponent为java14中的新特性。
// oracle官方描述:是Java 语言的预览功能。预览功能可能会在未来版本中删除,或者升级为 Java 语言的永久功能
public abstract class RecordComponentVisitor {}

// 对RecoredComponent的具体实现
final class RecordComponentWriter extends RecordComponentVisitor {}

// 对ASM 访问者实现的 ASM 兼容版本,补丁兼容处理
public final class SpringAsmInfo {}

// 抽象类,定义的相关常量
abstract class Symbol {}

// 在symbol的基础上,创建内部类,利用hash处理重复的问题
final class SymbolTable {}

// 提供操作类型和方法描述
public final class Type {}

// 对类型参数、通配符绑定、数组元素类型或静态内部类型的封装工具类
public final class TypePath {}

// 在类、字段、方法声明或指令上出现的对类型的引用
public class TypeReference {}

ok,从以上的功能点来说都是围绕java字节码的操作,包括注解、类、字段、方法、模块以及recoredComponent的具体操作,定义大量的抽象类和final修饰的类以及相关的静态代码和静态代码块。那么这些都在spring哪里应用到呢,比如 aop、cglib、spel表达式等