java - 如何使用Java和Rhino查找所有出现的Javascript函数

原文 标签 java javascript rhino

我需要使用Java和Rhino在Javascript文件中搜索特定Javascript函数的所有出现。我已经使用“访问者”模式成功浏览了所有发生的函数调用(请参见下面的代码),但是我无法检索被调用函数的名称。哪个是正确的方法?

package it.dss.javascriptParser;


import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

import org.mozilla.javascript.Parser;
import org.mozilla.javascript.ast.AstNode;
import org.mozilla.javascript.ast.FunctionCall;
import org.mozilla.javascript.ast.NodeVisitor;

public class JavascriptParser {

public static void main(String[] args) throws IOException {
    class Printer implements NodeVisitor {

        public boolean visit(AstNode node) {
            if (node instanceof FunctionCall) {
                              // How do I get the name of the function being called?

            }
            return true;
        }
    }

    String file = "/dss2.js";
    Reader reader = new FileReader(file);
    try {
        AstNode node = new Parser().parse(reader, file, 1);
        node.visit(new Printer());
    } finally {
        reader.close();
    }
}
}

最佳答案

FunctionCall类仅表示函数的调用,其目标是函数名称(org.mozilla.javascript.ast.Name)。

要获取被调用函数的名称,请使用:

AstNode target = ((FunctionCall) node).getTarget();
Name name = (Name) target;
System.out.println(name.getIdentifier());

相关文章:

javascript - XPath:如何从包含未知标签名称的路径中提取节点?

java - Rhino:原型(prototype)链不适用于宿主对象吗?

javascript - 是否可以在J2EE项目上使用纯JavaScript框架?

java - 从Maven调用时无法使用ant构建

java - 为什么静态泛型方法在返回类型前面应有<T>

java - 如何在Spring下在Jetty服务器上发布CXF Web服务?

javascript - Aurelia中的属性(property)和收款观察员未引发propertyChanged事件

javascript - React JS-如何重新渲染独立组件?

java - 无法执行使用Rhino JavaScript编译器编译的JavaScript文件

java - 如何使用JPA和Hibernate更新前N行