依赖
<dependencies>
<dependency>
<groupId>org.eclipse.jdt</groupId>
<artifactId>org.eclipse.jdt.core</artifactId>
<version>3.13.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
代码
package com.xxx.fsq;
import org.apache.commons.io.FileUtils;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.dom.*;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static org.eclipse.jdt.core.dom.AST.JLS8;
public class JdtTest {
public static void main(String[] args) {
ASTParser parser = ASTParser.newParser(AST.JLS8); //设置Java语言规范版本
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setCompilerOptions(null);
parser.setResolveBindings(true);
Map<String, String> compilerOptions = JavaCore.getOptions();
compilerOptions.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_8); //设置Java语言版本
compilerOptions.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_8);
compilerOptions.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_8);
parser.setCompilerOptions(compilerOptions); //设置编译选项
String src = null;
try {
src = FileUtils.readFileToString(new File("XXXController.java"), "UTF-8"); //要解析的文件
} catch (Exception e) {
e.printStackTrace();
}
parser.setSource(src.toCharArray());
CompilationUnit cu = (CompilationUnit) parser.createAST(null); //下个断点可以看看cu的types成员就是整个语法树
System.out.println(cu);
//get url
String classUrl = null;
String methodUrl = null;
String className = null;
String methodName = null;
List types = cu.types();
for (Object type : types) {
TypeDeclaration typeDeclaration = (TypeDeclaration) type;
className = typeDeclaration.getName().getIdentifier();
List<Expression> expressionsClass = getExpressions(typeDeclaration);
if (expressionsClass == null) {
System.out.println("x");
}
for (Expression expression : expressionsClass) {
classUrl = expression.toString().replace("\"", "");
}
MethodDeclaration[] methods = typeDeclaration.getMethods();
for (MethodDeclaration method : methods) {
methodName = method.getName().getIdentifier();
List<Expression> expressionsMethod = getExpressions(method);
if (expressionsMethod == null) {
continue;
}
for (Expression expression : expressionsMethod) {
methodUrl = expression.toString().replace("\"", "");
System.out.println(className + "\t" + methodName + "\t" + classUrl + methodUrl);
}
}
}
}
public static List<Expression> getExpressions(BodyDeclaration bodyDeclaration) {
List methodModifiers = bodyDeclaration.modifiers();
for (Object methodModifier : methodModifiers) {
if (methodModifier instanceof SingleMemberAnnotation) {
SingleMemberAnnotation modifier = (SingleMemberAnnotation) methodModifier;
String typeName = modifier.getTypeName().getFullyQualifiedName();
if (!typeName.equals("RequestMapping")) {
continue;
}
Expression v = modifier.getValue();
ArrayList<Expression> list = new ArrayList<Expression>();
list.add(v);
return list;
} else if (methodModifier instanceof NormalAnnotation) {
NormalAnnotation modifier = (NormalAnnotation) methodModifier;
String typeName = modifier.getTypeName().getFullyQualifiedName();
if (!typeName.equals("RequestMapping")) {
continue;
}
List values = modifier.values();
for (Object value : values) {
MemberValuePair memberValuePair = (MemberValuePair) value;
SimpleName simapleName = memberValuePair.getName();
String name = simapleName.getIdentifier();
if (!name.equals("value")) {
continue;
}
Expression v = memberValuePair.getValue();
if (v instanceof ArrayInitializer) {
ArrayInitializer ev = (ArrayInitializer) v;
List expressions = ev.expressions();
return expressions;
} else if (v instanceof Expression) {
ArrayList<Expression> list = new ArrayList<Expression>();
list.add(v);
return list;
}
}
}
}
return null;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!