如何获得最终包装名称?

伊万

我有代码

private static class MyVisitor extends VoidVisitorAdapter<Object> {
    @Override
    public void visit(MethodCallExpr exp, Object arg) {
        System.out.println("Scope: "  + exp.getScope());
        System.out.println("Method: " + exp.getName());
        if(exp.getArgs() != null)
            for(Expression e : exp.getArgs()) {
                System.out.println("\tArgument: " + e.toString());

            }
        System.out.println();
    }
}

CompilationUnit cu = JavaParser.parse(new File("Test.java"));

for(TypeDeclaration type : cu.getTypes()) {
    for(BodyDeclaration dec : type.getMembers()) {
        if(dec instanceof MethodDeclaration) {
            MethodDeclaration mdec = (MethodDeclaration) dec;
            BlockStmt block = mdec.getBody();
            for(Statement stmt : block.getStmts()) {
                MyVisitor visitor = new MyVisitor();
                s.accept(visitor, null);
            }
        }
    }
}

我有两个问题:

  1. 如何将Statement转换为Expression?我要检查的是该方法调用。我试图通过这种方式检查它们是否是不兼容的类型:if(stmt instanceof MethodCallExp)但是出现了错误。我输入了现在使用的代码。这是执行检查的一种方法吗?
  2. System.out.println("Scope: " + exp.getScope());将显示对象/包/包+类名。但是如何获得它的类型呢?例如代码System.out.println("Hello world");应输出

类型:java.io.PrintStream

  1. 语句和表达式之间没有1:1的关系。例如,ExpressionStmt仅包含一个Expression,而WhileStmt包含条件Expression和包含另一条Statement的主体。
  2. getScope()调用返回的FieldAccessExpr中不包含任何类型信息。JavaParser似乎没有提供获取类型的简便方法。使用Node层次结构及其类型,可以使用相应的Reflection类来实现目标。对于您的示例,这意味着找到最高范围(类型为NameExpr)并获取类对象(确认System是java.lang.System的缩写),对于下一个节点(类型为FieldAccessExpr),您将获得字段类,然后可以获取类型:
    Class.forName("java.lang.System").getField("out").getType();
    在上面的代码示例中,您将访问者传递给方法主体内的每个语句。如果在循环外创建访问者,它将能够记住先前语句中看到的信息。这样,您可以向访问者添加一个字段以存储变量声明:
    final HashMap varNameToType = new HashMap();
    您可以像下面那样存储变量声明。进行方法调用时,可以使用作用域尝试通过映射获取类型。如果映射不包含Type,则可能需要使用Reflection,因为变量可能是JDK类的一部分。我不建议这涵盖所有情况。例如,当您访问父类的字段时,您在代码中的位置将没有该字段的任何信息-您可能需要为此查看不同的编译单元。
@Override
public void visit(
        final VariableDeclarationExpr n,
        final Object arg) {
    final Type varType = n.getType();
    n.getVars().forEach(vd ->
        varNameToType.put(vd.getId().getName(),varType)
    );
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何识别包装名称?

来自分类Dev

在由函数装饰器包装后,如何获得函数的原始名称?

来自分类Dev

如何获得javascript的最终结果?

来自分类Dev

Lisp:如何获得最终的循环值?

来自分类Dev

如何获得CardHolder名称

来自分类Dev

如何使用Swig包装来自C ++的最终模板类?

来自分类Dev

如何获得包装的可变参数类型?

来自分类Dev

如何获得“字符串...”包装器?

来自分类Dev

厨师怎么知道如何从包装名称中安装包装?

来自分类Dev

如何克服“禁止包装名称”异常?

来自分类Dev

如何包装af:inputFile文本名称?

来自分类Dev

如何获得目标名称?

来自分类Dev

如何获得Ember班级的名称?

来自分类Dev

如何获得目录名称

来自分类Dev

如何获得父脚本的名称?

来自分类Dev

如何获得设备型号名称?

来自分类Dev

如何获得目标名称?

来自分类Dev

如何获得参考类的名称?

来自分类Dev

如何获得max的名称?的SQL

来自分类Dev

如何获得设备型号名称?

来自分类Dev

如何获得产品说明(名称)?

来自分类Dev

如何获得方法名称?

来自分类Dev

如何在流星中获得最终迭代数

来自分类Dev

我如何获得所有分钟的最终总和?

来自分类Dev

如何获得完美的核心本地任务最终状态?

来自分类Dev

如何在流星中获得最终迭代数

来自分类Dev

如何使用 NeuroLab 获得最终的神经网络错误?

来自分类Dev

IntelliJ显示速记包名称。如何查看实际的包装名称?

来自分类Dev

如何在HTML元素上获得最终的最终计算样式值?