如何获取java类的完全限定名称

时间:2014-03-27 10:08:30

标签: java javaparser

我有一个类似下面的课程。

public class Login {
    private Keyword browser;
    private String page;
}

Keyword是不同包中的类。我希望在使用javaparser解析Keyword类时获取类Login的完全限定名称。

8 个答案:

答案 0 :(得分:3)

您无法使用JavaParser执行此操作,因为JavaParser无法解析符号。要将名称关键字解析为类,您需要执行以下操作: *实现适当的范围规则(您需要查找内部类,然后查找同一文件中的其他类,然后考虑导入...) *它取决于用于编译的类路径:更改它可以以不同方式解析相同的类

要做到这一点,应该写一个符号解析器:它不是微不足道的,但是可行的。如果您对该主题感兴趣,可以阅读我刚写的How to build a symbol solver for Java, in Clojure帖子。该帖子还包含一个代码链接,可在GitHub上免费获得。

来源:我是JavaParser撰稿人

答案 1 :(得分:1)

到目前为止,似乎没有人阅读过这个问题,但如果你要解析源代码,要么是在当前包中,要么是由import语句导入的。

我原本希望Java解析器编写者或用户知道这一点。

答案 2 :(得分:1)

您可以使用JavaParser Symbol Solver:

<dependency>
    <groupId>com.github.javaparser</groupId>
    <artifactId>javaparser-symbol-solver-core</artifactId>
    <version>3.14.5</version>
</dependency>

然后使用以下配置来解析代码:

CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver(new ReflectionTypeSolver(), 
                                                     new JavaParserTypeSolver(sourceRoot));
final ParserConfiguration config = new ParserConfiguration()
                .setStoreTokens(true)
                .setSymbolResolver(new JavaSymbolSolver(combinedTypeSolver));
SourceRoot root = new SourceRoot(Paths.get("/path/to/project/"));
root.parse("", config, (Path localPath, Path absolutePath, ParseResult<CompilationUnit> result) -> {
                // Do something with the CompilationUnit
                return Result.DONT_SAVE;
            });

我们现在可以使用以下方法获取任何ReferenceType的完全限定的标识符:

ResolvedType type = referenceType.resolve();
String qualifiedName = type.getQualifiedName();

答案 3 :(得分:0)

如果您正在使用访问者,那么您似乎只获取源文件中的起始和结束索引以获取类型名称。这不会让你获得完全合格的名字。

因此,您还应在自定义访问者中实施visit(ImportDeclaration, A)方法。然后,此方法必须存储导入声明,以便稍后 - 当调用方法visit(FieldDeclaration, A)时 - 参考导入的包并组装完全限定名称。

答案 4 :(得分:0)

JavaParser不解析导入(无论如何,这通常不被认为是它的工作)。您必须手动单步执行import语句并搜索Keyword是否属于它们。请注意,Java会隐式执行import java.lang.*,否则您将无法解析String等类型。

Spring Roo有一个包含方法getJavaType(CompilationUnitServices compilationUnitServices, ClassOrInterfaceDeclaration cid)的{​​{3}}类。该类不是为Roo之外的用法而设计的,但您可以将其用作解决问题的模板。

答案 5 :(得分:0)

我编写了一种方法,该方法可以基于final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L; final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L; final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB; 对象(JavaParser的最新版本)获取完全限定名称:

ClassOrInterfaceDeclaration

如果获得该类的 private static String getFullyQualifiedName(ClassOrInterfaceDeclaration c2) { String name = ""; ClassOrInterfaceDeclaration parentClass = c2.getParentNode().isPresent() ? getClass(c2.getParentNode().get()): null; if(parentClass!=null) { name+=getFullyQualifiedName(parentClass)+"."; } else { CompilationUnit u = getCompilationUnit(c2); if(u!=null && u.getPackageDeclaration().isPresent()) { name+=u.getPackageDeclaration().get().getNameAsString()+"."; } } return name+c2.getNameAsString(); } private static ClassOrInterfaceDeclaration getClass(Node n1) { while (!(n1 instanceof ClassOrInterfaceDeclaration)) { if(n1.getParentNode().isPresent()) { n1 = n1.getParentNode().get(); } else return null; } return (ClassOrInterfaceDeclaration)n1; } private static CompilationUnit getCompilationUnit(Node n1) { while (!(n1 instanceof CompilationUnit)) { if(n1.getParentNode().isPresent()) { n1 = n1.getParentNode().get(); } else return null; } return (CompilationUnit)n1; } ,则可以使用更简单的版本:

ClassOrInterfaceType

我希望这对任何人都有帮助!

答案 6 :(得分:-2)

这可能是解决问题的更好方法,

使用。的实例。

use of "Instance of" in java

答案 7 :(得分:-2)

使用Java Reflection(java.lang.reflect)

相关问题