没有合适的资源?快使用搜索试试~ 我知道了~
JDK的Parser来解析Java源代码详解
1 下载量 10 浏览量
2020-09-01
14:36:37
上传
评论
收藏 57KB PDF 举报
温馨提示


试读
2页
主要介绍了JDK的Parser来解析Java源代码的相关资料,需要的朋友可以参考下
资源推荐
资源详情
资源评论













JDK的的Parser来解析来解析Java源代码详解源代码详解
主要介绍了JDK的Parser来解析Java源代码的相关资料,需要的朋友可以参考下
在JDK中,自带了一套相关的编译API,可以在Java中发起编译流程,解析Java源文件然后获取其语法树,在JDK的
tools.jar(OSX下可以在/Library/Java/JavaVirtualMachines/jdk_version/Contents/Home/lib中找到)中包含着这整套API,但
是这却不是Oracle和OpenJDK发布中的公开API,因此对于这套API,并没有官方的正式文档来进行说明。但是,也有不少项
目利用了这套API来做了不少事情,例如大名鼎鼎的lombok使用了这套API在Annotation Processing阶段修改了源代码中的语
法树,最终结果相当于直接在源文件中插入了新的代码!
由于这套API目前缺少相关文档,使用起来比较困难,例如,解析源代码中的所有变量,并打印出来:
public class JavaParser {
private static final String path = "User.java";
private JavacFileManager fileManager;
private JavacTool javacTool;
public JavaParser() {
Context context = new Context();
fileManager = new JavacFileManager(context, true, Charset.defaultCharset());
javacTool = new JavacTool();
}
public void parseJavaFiles() {
Iterable<!--? extends JavaFileObject--> files = fileManager.getJavaFileObjects(path);
JavaCompiler.CompilationTask compilationTask = javacTool.getTask(null, fileManager, null, null, null, files);
JavacTask javacTask = (JavacTask) compilationTask;
try {
Iterable<!--? extends CompilationUnitTree--> result = javacTask.parse();
for (CompilationUnitTree tree : result) {
tree.accept(new SourceVisitor(), null);
}
} catch (IOException e) {
e.printStackTrace();
}
}
static class SourceVisitor extends TreeScanner<void, void=""> {
private String currentPackageName = null;
@Override
public Void visitCompilationUnit(CompilationUnitTree node, Void aVoid) {
return super.visitCompilationUnit(node, aVoid);
}
@Override
public Void visitVariable(VariableTree node, Void aVoid) {
formatPtrln("variable name: %s, type: %s, kind: %s, package: %s",
node.getName(), node.getType(), node.getKind(), currentPackageName);
return null;
}
}
public static void formatPtrln(String format, Object... args) {
System.out.println(String.format(format, args));
}
public static void main(String[] args) {
new JavaParser().parseJavaFiles();
}
}</void,>
其中 User.java的代码如下:
package com.ragnarok.javaparser;
import com.sun.istack.internal.Nullable;
import java.lang.Override;
public class User {
@Nullable
资源评论


weixin_38590996
- 粉丝: 8
- 资源: 929
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
