当前位置: 首页 > 知识库问答 >
问题:

如何使用javaparser获取类级变量声明?

黄靖
2023-03-14

我只想得到类级别的变量声明。如何使用javaparser获取声明?

public class Login {

    private Keyword browser;
    private String pageTitle = "Login";
}

使用javaparser必须获取变量“浏览器”的详细信息,例如浏览器的类型是“KeyWord”

共有2个答案

唐睿
2023-03-14

要将上述答案更新为最新版本的JavaParser:

CompilationUnit cu = JavaParser.parse("public class Login {\n" +
        "\n" +
        "    private Keyword browser;\n" +
        "    private String pageTitle = \"Login\";\n" +
        "}\n");

for (TypeDeclaration<?> typeDec : cu.getTypes()) {
    for (BodyDeclaration<?> member : typeDec.getMembers()) {
        member.toFieldDeclaration().ifPresent(field -> {
            for (VariableDeclarator variable : field.getVariables()) {
                //Print the field's class typr
                System.out.println(variable.getType());
                //Print the field's name
                System.out.println(variable.getName());
                //Print the field's init value, if not null
                variable.getInitializer().ifPresent(initValue -> System.out.println(initValue.toString()));
            }
        });
    }
}

一种无需太多麻烦就可以到达现场声明的方法是。。。

cu.findAll(FieldDeclaration.class).forEach(field -> {
    field.getVariables().forEach(variable -> {
        //Print the field's class typr
        System.out.println(variable.getType());
        //Print the field's name
        System.out.println(variable.getName());
        //Print the field's init value, if not null
        variable.getInitializer().ifPresent(initValue -> System.out.println(initValue.toString()));
    });
});

两者之间的功能区别在于,第一个只在顶级类中查找,第二个也将在嵌套类中查找。

巫马欣嘉
2023-03-14

我不太明白你的问题-你想得到一个类的所有字段成员吗?如果是这样,你可以这样做:

CompilationUnit cu = JavaParser.parse(javaFile);
for (TypeDeclaration typeDec : cu.getTypes()) {
    List<BodyDeclaration> members = typeDec.getMembers();
    if(members != null) {
        for (BodyDeclaration member : members) {
        //Check just members that are FieldDeclarations
        FieldDeclaration field = (FieldDeclaration) member;
        //Print the field's class typr
        System.out.println(field.getType());
        //Print the field's name 
        System.out.println(field.getVariables().get(0).getId().getName());
        //Print the field's init value, if not null
        Object initValue = field.getVariables().get(0).getInit();
        if(initValue != null) {
             System.out.println(field.getVariables().get(0).getInit().toString());
        }  
    }
}

此代码示例将在您的案例中打印:Keyword browser String pageTitle“Login”

我希望这真的是你的问题...如果没有,请评论。

 类似资料:
  • 我能够使用以下代码获得类级变量的声明。但我只需要变量名。这是以下代码的输出-[私有布尔标志=true;]

  • 这是A.java 我想得到Newa. java 我想使用javaparser添加一个变量。

  • 我正在分析的类: 我正在尝试使用MethodDeclaration获取变量名,但无法做到这一点。 我正在尝试获取此is的输出。 verifyAgeLimit():此。名称或名称 verifyAgeLimit():此。名称或名称 showAddress():此。地址或地址 我试图将整个方法转换为sting并读取字符串以找出名称,但它变得太复杂,而且精度也很低。 有什么办法可以解决吗?

  • 例如,我可以获得开始行和结束行,但是如何获得开始行和结束行之间的源代码呢。下面是示例代码。 我想得到下面的代码,这是与cmds相关的定义。

  • 是否可以获取不带注释的方法语句列表,我使用了,这是输出 我只想声明结果是这样的

  • react用vite搭建的项目 想要做代码提示,必须声明variables的类型,不想再像下面这样写一遍。 想直接根据scss中定义的变量生成类型声明,要怎么做?类似 但是因为variables是个cssmodule,而不是个具体的对象,上面的写法还是不行? 有没有好的方式解决?