java - 如何从 JAVA 文件中解析静态级别变量?
问题描述
我正在尝试从 JAVA 文件中解析静态变量值。但无法解析变量。
我使用 JavaParser 来解析代码并获取变量的值。我成功获取了所有其他类级别的变量和值,但无法解析静态字段。
Java文件看起来像......
public class ABC {
public string variable1 = "Hello How are you?";
public boolean variable2 = false;
public static String variable3;
static{
variable3 = new String("Want to Fetch this...");
}
//Can't change this file, this is input.
public static void main(String args[]){
//....Other Code
}
}
我能够解析除“variabl3”之外的所有变量值。Java 文件的代码看起来像上面的 Java 代码,我需要解析“variable3”的值。
我已经完成了下面的代码来解析类级变量......
import java.util.HashMap;
import java.util.List;
import com.github.javaparser.ast.body.FieldDeclaration;
import com.github.javaparser.ast.body.VariableDeclarator;
import com.github.javaparser.ast.expr.VariableDeclarationExpr;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
public class StaticCollector extends
VoidVisitorAdapter<HashMap<String, String>> {
@Override
public void visit(FieldDeclaration n, HashMap<String, String> arg) {
// TODO Auto-generated method stub
List <VariableDeclarator> myVars = n.getVariables();
for (VariableDeclarator vars: myVars){
vars.getInitializer().ifPresent(initValue -> System.out.println(initValue.toString()));
//System.out.println("Variable Name: "+vars.getNameAsString());
}
}
}
主要方法...
public class Test {
public static void main(String[] args) {
File file = new File("filePath");
CompilationUnit compilationUnit = null;
try {
compilationUnit = JavaParser.parse(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
HashMap<String, String> collector = new HashMap<String, String>();
compilationUnit.accept(new StaticCollector(), collector);
}
}
我如何解析“variable3”的值,它是静态的,并且在静态块中分配了值?代码中可能还有其他变量,但我需要找到特定变量值的值(在本例中为 Variable3)。我做错了什么还是我需要添加一些其他方式,请建议。
解决方案
将 AST 检查为易于阅读的内容,例如,使用 PlantUML 的 DOT (GraphViz) 图像对解决此类问题有很大帮助。有关如何生成 DOT 以及其他格式的信息,请参阅此博客。
这是概述,突出显示了“variable3”节点(我只是在 .dot 输出中搜索它并添加了填充颜色)。你会看到它发生在两个地方:
放大右边的节点空间,我们可以看到第二个子树在InitializerDeclaration
. 再往下,它是AssignExpr
值的一部分ObjectCreationExpr
:
所以,我调整了您的访问者(它是一个内部类,使模块自包含),您需要重写该visit(InitializerDeclaration n...
方法以到达您想要的位置:
import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.FieldDeclaration;
import com.github.javaparser.ast.body.InitializerDeclaration;
import com.github.javaparser.ast.body.VariableDeclarator;
import com.github.javaparser.ast.stmt.Statement;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.List;
public class Test {
public static void main(String[] args) {
File file = new File("src/main/java/ABC.java");
CompilationUnit compilationUnit = null;
try {
compilationUnit = StaticJavaParser.parse(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
HashMap<String, String> collector = new HashMap<String, String>();
compilationUnit.accept(new StaticCollector(), collector);
}
private static class StaticCollector extends
VoidVisitorAdapter<HashMap<String, String>> {
@Override
public void visit(FieldDeclaration n, HashMap<String, String> arg) {
List<VariableDeclarator> myVars = n.getVariables();
for (VariableDeclarator vars: myVars){
vars.getInitializer().ifPresent(initValue -> System.out.println(initValue.toString()));
//System.out.println("Variable Name: "+vars.getNameAsString());
}
}
@Override
public void visit(InitializerDeclaration n, HashMap<String, String> arg) {
List<Statement> myStatements = n.getBody().getStatements();
for (Statement s: myStatements) {
s.ifExpressionStmt(expressionStmt -> expressionStmt.getExpression()
.ifAssignExpr(assignExpr -> System.out.println(assignExpr.getValue())));
}
}
}
}
这是在静态块中显示另外variable3
的初始化的输出:
"Hello How are you?"
false
new String("Want to Fetch this...")
推荐阅读
- javascript - 单击关闭按钮时如何将焦点轮廓返回到按钮
- python - 如何通过交换 Python 中的节点来修复或更正 BST?
- android - PhoneStateListener 在 delphi firemonkey 中收听 OnCellInfoChanged 的问题
- python - 安装 rel 模块时遇到错误
- python - 使用熊猫在时间序列图中查找模式
- linux - 无法打开 /dev/tty(2,3,4)。没有这样的文件或目录
- sed - 命令 `sed -i "s/^ \+//g; s/ \+/\t/g" 是什么意思?
- sql - 查询:查找已使用最大零件数的项目名称
- docker - docker 容器在入口点退出
- autocomplete - Angular 6 Material Autocomplete 选择错误