【问题标题】:How to parse inner class from java source code如何从java源代码解析内部类
【发布时间】:2018-11-14 12:53:05
【问题描述】:

我使用https://github.com/javaparser/javaparser解析java源码

我尝试了很多方法来解析内部类;像这样:

class A {
    int x;
    public void method2() {...}
        class B {
            int number;
            public void methods() {...}
        }
    }

我尝试解析 B 类及其变量和方法,但失败了。

有没有例子说明如何获取B类?

我可以解析A类方法名和内容或变量内容,像这样:

 CompilationUnit cu = JavaParser.parse(in);

 ClassVisitor classVisitor = new ClassVisitor();
 classVisitor.visit(cu, null);

 class ClassVisitor extends VoidVisitorAdapter<Void> {
    @Override
    public void visit(ClassOrInterfaceDeclaration n, Void arg) {
        System.out.println(n.getFields());

        // get class methods
        for(MethodDeclaration method : n.getMethods()) {
            System.out.println("Name :" + method.getName());
            System.out.println("Body :" + method.getBody().get());
           }
        }
    }
}

但我尝试解析 B 类变量和方法,失败了!

试试 CompilationUnit.getTypes(),像这样:

CompilationUnit cu = JavaParser.parse(in);

for(TypeDeclaration<?> type : cu.getTypes()) {
    log.info("Type Name :{}", type.getName());
}

结果: n.s.dictionary.parse.JavaCodeParse:类型名称:A

未解析为 B 类

【问题讨论】:

  • 请编辑您的问题以包含您拥有的完整源代码并描述它是如何失败的(错误消息、错误值......)。见stackoverflow.com/help/mcve
  • 但是我想分析未知的java文件,所以不知道它包含什么类。
  • 我认为 CompilationUnit.getTypes() 调用可能会返回任何嵌套类的名称(但我不熟悉它,所以只是猜测)。
  • 感谢您的建议。我试过了,但没有用。

标签: java javaparser


【解决方案1】:

送给有需要的人:

for(TypeDeclaration type : cu.getTypes()) {
        // first give all this java doc member
        List<BodyDeclaration> members = type.getMembers();
        // check all member content
        for(BodyDeclaration member : members) {
            // if member state equal ClassOrInterfaceDeclaration, and you can identify it which is inner class
            if(member.isClassOrInterfaceDeclaration()) {
                log.info("class name :{}", member.asClassOrInterfaceDeclaration().getName());
                // get inner class method
                for(MethodDeclaration method : member.asClassOrInterfaceDeclaration().getMethods()) {
                    log.info("Method Name :{}", method.getName());
                }
                VerifyInnerClassAndParse(member.asClassOrInterfaceDeclaration());
            }
        }
    }

如果你有很多内部类,只需编写递归方法

【讨论】:

    【解决方案2】:

    不需要递归,您只需在访问者方法中调用 super.visit(n, arg)。

    【讨论】:

      猜你喜欢
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      相关资源
      最近更新 更多