JavaParser:检测 FieldDeclaration 是否为接口类型
JavaParser: Detect if FieldDeclaration is Interface Type
我正在使用 JavaParser 收集 class 元数据以存储在 JSON 对象中。对于我收集的每个编译单元,我还收集了一个 FieldDeclarations 列表。对于每个 FieldDeclaration,我想看看类型是否是接口类型。
在 java 文档中,我注意到 FieldDeclaration 从 BodyDeclaration 继承 isClassOrInterfaceDeclaration()
,但是我想要 isInterfaceDeclaration()
.
不过,我注意到 class ClassOrInterfaceDeclaration
有一个方法 isInterface()
。
拿 FieldDeclaration f
做这样的事情是不是不负责任:
Boolean b = f.toClassOrInterfaceDeclaration().isInterface()
最后我想区分一个FieldDeclaration是Class类型,还是Interface类型。
我也考虑过的是:
Type t = f.getElementType() ;
// Dodgy code ahead
if(t == Class) { // do something...}
如果有人能指出我正确的方向,任何帮助将不胜感激。
编辑:
我所做的一些探索性测试产生了一些意想不到的结果。我从一个 class 中收集了一个 Field 声明列表,这些字段是:
private String s;
private String addedState ;
// Component is an interface
private Component c ;
在对每个字段执行 isClassOrInterfaceDeclaration()
时,每个字段都返回 false。但是当我执行时:
f.forEach(n->System.out.println(n.getElementType().isClassOrInterfaceType())) ;
每一个都返回 true。
我关于预期输出的假设已被证明是错误的。
编辑 2:我开始意识到为什么调用 isClassOrInterfaceDeclaration() 不会产生 true,因为字段实际上没有声明 class 或接口。我需要找到一种方法来确定类型是 Class 还是接口。
我认为您正在寻找的是 Java 符号求解器,它包含在 JavaParser 中。
要使用它,您必须以某种方式实例化解析器
//The files are jar files that contain types you want to resolve
static final JavaParser createJavaParser(File... jarFiles) {
CombinedTypeSolver typeSolver = new CombinedTypeSolver();
//Allows you to resolve types that comes with the JDK
typeSolver.add(new ReflectionTypeSolver());
// Make it so the parser can recognize types within the jar files
try {
for (File jar : jarFiles) {
typeSolver.add(new JarTypeSolver(jar));
}
} catch (IOException e) {
e.printStackTrace();
}
// Create the config for the parser
JavaSymbolSolver symbolSolver = new JavaSymbolSolver(typeSolver);
ParserConfiguration parserConfiguration = new ParserConfiguration();
parserConfiguration.setSymbolResolver(symbolSolver);
// Construct the parser
return new JavaParser(parserConfiguration);
}
如果 CompilationUnit
是使用此方法的解析器构造的,则可以使用以下代码确定 FieldDeclaration
的类型是否为接口类型
static final boolean hasInterfaceType(FieldDeclaration f) {
return f.resolve().declaringType().isInterface();
}
我正在使用 JavaParser 收集 class 元数据以存储在 JSON 对象中。对于我收集的每个编译单元,我还收集了一个 FieldDeclarations 列表。对于每个 FieldDeclaration,我想看看类型是否是接口类型。
在 java 文档中,我注意到 FieldDeclaration 从 BodyDeclaration 继承 isClassOrInterfaceDeclaration()
,但是我想要 isInterfaceDeclaration()
.
不过,我注意到 class ClassOrInterfaceDeclaration
有一个方法 isInterface()
。
拿 FieldDeclaration f
做这样的事情是不是不负责任:
Boolean b = f.toClassOrInterfaceDeclaration().isInterface()
最后我想区分一个FieldDeclaration是Class类型,还是Interface类型。
我也考虑过的是:
Type t = f.getElementType() ;
// Dodgy code ahead
if(t == Class) { // do something...}
如果有人能指出我正确的方向,任何帮助将不胜感激。
编辑: 我所做的一些探索性测试产生了一些意想不到的结果。我从一个 class 中收集了一个 Field 声明列表,这些字段是:
private String s;
private String addedState ;
// Component is an interface
private Component c ;
在对每个字段执行 isClassOrInterfaceDeclaration()
时,每个字段都返回 false。但是当我执行时:
f.forEach(n->System.out.println(n.getElementType().isClassOrInterfaceType())) ;
每一个都返回 true。
我关于预期输出的假设已被证明是错误的。
编辑 2:我开始意识到为什么调用 isClassOrInterfaceDeclaration() 不会产生 true,因为字段实际上没有声明 class 或接口。我需要找到一种方法来确定类型是 Class 还是接口。
我认为您正在寻找的是 Java 符号求解器,它包含在 JavaParser 中。
要使用它,您必须以某种方式实例化解析器
//The files are jar files that contain types you want to resolve
static final JavaParser createJavaParser(File... jarFiles) {
CombinedTypeSolver typeSolver = new CombinedTypeSolver();
//Allows you to resolve types that comes with the JDK
typeSolver.add(new ReflectionTypeSolver());
// Make it so the parser can recognize types within the jar files
try {
for (File jar : jarFiles) {
typeSolver.add(new JarTypeSolver(jar));
}
} catch (IOException e) {
e.printStackTrace();
}
// Create the config for the parser
JavaSymbolSolver symbolSolver = new JavaSymbolSolver(typeSolver);
ParserConfiguration parserConfiguration = new ParserConfiguration();
parserConfiguration.setSymbolResolver(symbolSolver);
// Construct the parser
return new JavaParser(parserConfiguration);
}
如果 CompilationUnit
是使用此方法的解析器构造的,则可以使用以下代码确定 FieldDeclaration
的类型是否为接口类型
static final boolean hasInterfaceType(FieldDeclaration f) {
return f.resolve().declaringType().isInterface();
}