如何从 java 源代码解析内部 class
How to parse inner class from java source code
我使用https://github.com/javaparser/javaparser解析java源代码
我尝试了很多方法来解析内部 class ;像这样:
class A {
int x;
public void method2() {...}
class B {
int number;
public void methods() {...}
}
}
我尝试解析 class B 及其变量和方法,但我失败了。
是否有任何示例说明如何获得 B class?
我可以解析 class 方法名称和内容或变量内容,如下所示:
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());
}
}
}
}
但是我尝试解析 class 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 class
对于需要它的人:
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());
}
}
}
如果你有很多内class,就写递归方法
不需要递归,您只需在访问者方法中调用 super.visit(n, arg)。
我使用https://github.com/javaparser/javaparser解析java源代码
我尝试了很多方法来解析内部 class ;像这样:
class A {
int x;
public void method2() {...}
class B {
int number;
public void methods() {...}
}
}
我尝试解析 class B 及其变量和方法,但我失败了。
是否有任何示例说明如何获得 B class?
我可以解析 class 方法名称和内容或变量内容,如下所示:
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());
}
}
}
}
但是我尝试解析 class 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 class
对于需要它的人:
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());
}
}
}
如果你有很多内class,就写递归方法
不需要递归,您只需在访问者方法中调用 super.visit(n, arg)。