AST 语法入门
以前使用 Lombok 一直觉得是一个很棒的设计,可以同时兼顾注解的遍历和运行的性能。
运行时注解一直因为性能问题被人诟病。
自己尝试写过一些框架,但是耗费了比较多的精力,因为 AST 语法不是很熟悉,所以准备整一个系列,入门学习下 AST 语法。
AST(Abstract syntax tree) 抽象语法树
AST是javac编译器阶段对源代码进行词法语法分析之后,语义分析之前进行的操作。
用一个树形的结构表示源代码,源代码的每个元素映射到树上的节点。
java 编译时的三个阶段
Java源文件->词法,语法分析-> 生成AST ->语义分析 -> 编译字节码,二进制文件。
通过操作 AST 可以实现 java 源代码的功能。
Rewrite、JavaParser 等开源工具可以帮助你更简单的操作AST。
-
所有源文件会被解析成语法树。
-
调用注解处理器。如果注解处理器产生了新的源文件,新文件也要进行编译。
-
最后,语法树会被分析并转化成类文件。
启动加载
二进制文件==》intstrument
jvm 加载运行时
个人愿景
通过学习 AST 和 javaParser 等优秀框架的精华,提炼一个可以非常方便生成 class 文件的工具。
思路
源文件==》拓展后的文件==》AST 语法树==》class 文件覆盖
其他
后续学习下 java-sandbox 的思想和实现方式,拓展一下 AOP 的实现种类。
灵活强大。
可以做什么?
javadoc 源码级别生成
能否跨项目?把注释关联起来
项目信息分析
各种依赖关系 + 注释等等。
拓展阅读
java 的字节码处理包有哪些
在Java中,有几个常用的字节码处理库,它们可以帮助开发人员在运行时修改、生成和分析Java字节码。以下是其中一些常见的字节码处理库:
-
ASM (ObjectWeb ASM): ASM 是一个轻量级的Java字节码操作框架,它可以用于在不加载类的情况下直接操作字节码。ASM提供了高性能的字节码操作接口,广泛用于Java字节码生成和转换。它允许您以非常底层的方式访问和修改字节码。
官方网站:ASM
-
Byte Buddy: Byte Buddy 是一个用于生成和修改Java字节码的库。它提供了一个简单而强大的API,用于在运行时创建和修改Java类。Byte Buddy的API设计非常直观,使得动态字节码生成变得相当容易。
官方网站:Byte Buddy
-
Javassist: Javassist 是一个用于在运行时编辑字节码的库。它提供了高级别的API,允许开发人员以更面向对象的方式编辑字节码。Javassist还提供了对类的池化访问,以及在不加载类的情况下进行字节码操作的能力。
官方网站:Javassist
-
CGLIB: CGLIB 是一个用于生成动态代理和增强Java类的库。它基于ASM库,可以在运行时生成子类或代理对象,以实现方法拦截和增强。CGLIB广泛用于AOP(面向切面编程)和其他动态代理场景。
官方网站:CGLIB
-
AspectJ: AspectJ 是一个面向切面编程的扩展,它允许在编译时或运行时织入切面(Aspect)到Java类中。AspectJ提供了一种强大的方式来处理横切关注点(cross-cutting concerns),例如日志记录、性能监控和事务管理。
官方网站:AspectJ
这些库为Java开发人员提供了灵活的选项,可以在运行时操作字节码,实现动态性和元编程。选择哪个库取决于项目的需求和开发人员的偏好。
javaparser 呢
JavaParser 是一个用于解析、操作和生成Java源代码的开源库。
与前述提到的字节码处理库不同,JavaParser 主要针对的是源代码级别的操作,而不是字节码级别的操作。它可以帮助开发人员在Java源代码的层面上进行操作,例如分析、修改、生成源代码等。
使用 JavaParser,您可以将Java源代码解析为抽象语法树(Abstract Syntax Tree,AST),然后在AST上执行各种操作。这使得开发人员可以编写代码来分析和修改源代码,而无需手动解析文本。
JavaParser 提供了易于使用的API,支持Java 1.0 到 Java 16 的语法。它可以用于各种任务,包括代码生成、代码重构、静态分析、代码检查和转换等。
以下是 JavaParser 的官方网站链接:
- 官方网站:JavaParser
使用 JavaParser,您可以轻松地在源代码级别上进行各种操作,使得代码分析和修改变得更加方便和高效。
思考
是否可以不拘泥于 maven 插件,直接通过 java-parser 解析生成对应的 java-doc 呢?
Q3: 类似 javaParser 的开源工具
除了JavaParser,还有其他一些类似的开源工具,用于解析、操作和分析Java代码。以下是其中一些常见的开源Java代码解析工具:
-
Eclipse JDT (Java Development Tools): Eclipse JDT 是 Eclipse IDE 中内置的Java开发工具,它提供了强大的Java代码解析和分析功能。您可以使用 JDT 提取源代码中的信息、进行语法分析和语义分析,以及执行其他与Java代码相关的操作。
官方网站:Eclipse JDT
-
ANTLR (ANother Tool for Language Recognition): ANTLR 是一个强大的语法分析器生成器,它可以用于解析多种语言,包括Java。您可以使用ANTLR定义自定义语法规则,并生成用于解析和分析源代码的解析器。
官方网站:ANTLR
-
Javacc (Java Compiler Compiler): JavaCC 是一个用于生成Java编译器和解析器的工具。它允许您定义自定义语法规则,并生成用于解析源代码的Java解析器。
官方网站:JavaCC
-
Spoon: Spoon 是一个开源的Java程序分析和转换框架,它允许您在Java代码的层面上进行分析、修改和生成。Spoon 提供了一种高级别的API,用于操作Java代码,支持代码生成、代码转换和静态分析等任务。
官方网站:Spoon
-
PMD: PMD 是一个静态代码分析工具,它支持多种编程语言,包括Java。PMD 可以帮助您发现代码中的潜在问题、不良实践和性能问题。它提供了多种规则集,用于执行各种静态代码分析任务。
官方网站:PMD
这些工具提供了不同级别的功能和灵活性,可以根据您的需求选择适合的工具。无论是进行源代码解析、静态分析还是自定义语法分析,这些工具都可以帮助您实现相应的任务。