ScriptEngineManager能给我它刚刚用Java编译的Javascript函数的名称吗

Can ScriptEngineManager give me the name of the Javascript function it has just compiled in Java

本文关键字:函数 Javascript 编译 Java ScriptEngineManager      更新时间:2023-09-26

如何找到用Java解析的javascript函数的名称。我允许用户输入Javascript函数(在JTextArea中),然后我使用ScriptEngineManager来确认它是有效的语法,如下所示:

public final boolean isFunctionValid(String function)
{
    try
    {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("JavaScript");
        Object result = engine.eval(function);
    }
    catch(ScriptException se)
    {
        return false;
    }
    return true;
}

工作正常,但我也想知道函数的名称,这样我就可以为函数指定一个与函数名称匹配的名称。我更喜欢ScriptEngineManager为我做这件事,而不是让我尝试通过解析变量函数来解决这个问题,同时考虑这种方法的所有固有风险

编辑由于似乎没有办法正确地做到这一点,我使用对我有效的正则表达式创建了两个检查

    protected static Pattern functionNameMatch;
    protected static Pattern multipleFunctionsMatch;
    static
    {
        functionNameMatch = Pattern.compile("function[ ]+([a-zA-Z0-9]*)[ ]*''(");
        multipleFunctionsMatch = Pattern.compile("function[ ]+");
    }

    protected boolean isOneFunction()
    {
        Matcher m = multipleFunctionsMatch.matcher(function.getText());
        if(m.find())
        {
            if(m.find())
            {
                return false;
            }
            return true;
        }
        return false;
    }
    protected String deriveNameFromFunction()
    {
        Matcher m = functionNameMatch.matcher(function.getText());
        if(m.find())
        {
            return m.group(1);
        }
        return "";
    }

由于这在JavaScript中是不可能的,我使用模式匹配代替进行了一些额外的检查

protected static Pattern functionNameMatch;
protected static Pattern multipleFunctionsMatch;
static
{
    //TODO this method only works if all parameters are put on first line of function, otherwise declares function
    //is invalid
    functionNameMatch = Pattern.compile("function[ ]+([a-zA-Z0-9]*[ ]*''(.*''))");
    multipleFunctionsMatch = Pattern.compile("function[ ]+");
}
protected boolean isOneFunction()
{
    Matcher m = multipleFunctionsMatch.matcher(function.getText());
    if(m.find())
    {
        if(m.find())
        {
            return false;
        }
        return true;
    }
    return false;
}
protected String deriveNameFromFunction()
{
    Matcher m = functionNameMatch.matcher(function.getText());
    if(m.find())
    {
        return m.group(1);
    }
    return "";
}