#java #super #javaparser
#java #супер #javaparser
Вопрос:
Я разрабатываю Java-приложение на основе JavaParser. Я не знаю, как получить имя класса по ключевому слову, используемому в теле метода. В качестве примера, мне нужно знать, что ключевое слово Super в приведенном ниже коде относится к классу A.
class A {
public void bar(){...}
}
class B extends A {}
class C extends B {
void foo(){
super.bar() // I want to find that the super keyword is referred to Class A.
}
}
Я проверил эти функции (1, 2 и 3), предоставленные JavaParser, но ни одна из них не сработала, все возвращают null.
MethodCallExpr methodCallExpr = ...
Optional<Expression> scope = methodCallExpr.getScope();
SuperExpr superExp = scope.get().asSuperExpr();
1. superExp.findAll(ClassOrInterfaceDeclaration.class); and
2. superExp.getTypeName();
3. superExp.getClassExpr(); //I do not know why this method also returns null
Комментарии:
1. Является
expr
типаMethodCallExpr
? Если это так, похоже, вам нужно использоватьgetScope()
:expr.getScope().asSuperExpr()
2. Я на самом деле сделал то же самое, но не работает. Я обновил вопрос, чтобы показать это.
3. super в вашем примере относится к классу B (который является суперклассом текущего класса C), а не A.
4. Предположим, что класс C наследуется непосредственно от класса A. это не имеет никакого эффекта, и результаты по-прежнему равны нулю.
Ответ №1:
Я нахожу правильный метод.
ResolvedType resolvedType = superExp.calculateResolvedType();
Этот метод работает правильно, если вы также добавляете JavaSymbolSolver в конфигурацию синтаксического анализатора. JavaSymbolSolver необходим для разрешения ссылок и поиска связей между узлами.
TypeSolver reflectionTypeSolver = new ReflectionTypeSolver();
TypeSolver javaParserTypeSolver = new JavaParserTypeSolver(projectSourceDir);
CombinedTypeSolver combinedSolver = new CombinedTypeSolver();
combinedSolver.add(reflectionTypeSolver);
combinedSolver.add(javaParserTypeSolver);
ParserConfiguration parserConfiguration = new ParserConfiguration()
.setSymbolResolver(new JavaSymbolSolver(combinedSolver));
SourceRoot sourceRoot = new SourceRoot(projectSourceDir.toPath());
sourceRoot.setParserConfiguration(parserConfiguration);