JavaParser: определить, является ли FieldDeclaration типом интерфейса - PullRequest
1 голос
/ 30 марта 2020

Я собираю метаданные класса, используя JavaParser для хранения в JSON объекте. Для каждой единицы компиляции, которую я собираю, я также собираю список FieldDeclarations. Для каждого FieldDeclaration я хотел бы видеть, является ли тип интерфейсным типом.

В java do c я заметил, что FieldDeclaration наследует isClassOrInterfaceDeclaration() от BodyDeclaration, однако мне хотелось бы что-то вроде isInterfaceDeclaration().

Однако я заметил, что класс ClassOrInterfaceDeclaration имеет метод isInterface(). Было бы безответственно взять FieldDeclaration f и сделать что-то вроде:

Boolean b = f.toClassOrInterfaceDeclaration().isInterface()

В конечном счете, я хотел бы различить guish, имеет ли FieldDeclaration тип Class или Тип интерфейса.

Я также рассмотрел следующее:

Type t = f.getElementType() ;
// Dodgy code ahead
if(t == Class) { // do something...}

Если кто-то может указать мне в правильном направлении, любая помощь будет принята с благодарностью.

Редактировать: Некоторые предварительные испытания, которые я провел, дали неожиданные результаты. Я собрал список объявлений полей из класса, поля:

private String s;
private String addedState ;
// Component is an interface
private Component c ;

При выполнении isClassOrInterfaceDeclaration() для каждого из этих полей каждое из них возвращало false. Но когда я выполнил:

f.forEach(n->System.out.println(n.getElementType().isClassOrInterfaceType())) ;

каждый вернул истину.

Мои предположения относительно ожидаемого результата оказались ложными.

Редактировать 2: Я пришел к выводу, почему вызов isClassOrInterfaceDeclaration () не дает true, потому что поля буквально не объявляют класс или интерфейс. Мне нужно найти способ определить, является ли тип классом или интерфейсом.

1 Ответ

1 голос
/ 03 апреля 2020

Я думаю, что вы ищете 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();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...