这是我参与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表达式等