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();
 }