java - 如何使用 Java ScriptEngine 创建 Javascript 函数

标签 java javascript scriptengine

在这个问题中,我询问了有关支持表达式语言的问题,并成功使用了 Javascript 思想 Putting a simple expression language into java

但是所需的 Javascript 表达式已经变得非常冗长,我正在尝试弄清楚如何使用 ScriptEngine 来创建我可以在表达式中引用的 javascript 函数,以便表达式可以更短。

到目前为止,我已经通过在用户输入的字符串上使用 reexp 破解了一个解决方案,该字符串可以包含一个名为 ifempty 的伪函数,然后在传递给脚本引擎之前将其转换为 JavaScript

public final String formatFromMask(String mask,Song exampleSong)
    {
        mask = convertPsuedoFunctions(mask);
        try
        {
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName("JavaScript");
            for(SongFieldName next:SongFieldName.values())
            {
                engine.put(next.getScriptVar(),exampleSong.getFieldValueOrEmptyString(next.getSongFieldKey()));
            }
            Object result = engine.eval(mask);
            return (String)result;
        }
        catch(ScriptException se)
        {
            se.printStackTrace();
        }
        return "";
    }


    private String convertPsuedoFunctions(String mask)
    {
        //i.e ifnotempty(artist,' - ') -> (artist.length>0 ? artist + ' - ' : '')
        mask=mask.replaceAll("ifnotempty\\(([a-z]*)\\,('.*')\\)",
                             "($1.length>0 ? $1 + $2 : '')");

        return mask;
    }

它可以解析诸如这样的表达式

ifnotempty(album,'/')
+ ifnotempty(artist,' - ')
+ ifnotempty(album,' - ')
+ ifnotempty(track,' - ')
+ ifnotempty(title,'')

但我想知道一个合适的解决方案,我实际上可以创建一个真正的 JavaScript 函数。

最佳答案

为什么不创建一个真正的 Javascript 函数并将其添加到脚本中?

function ifnotempty(value,sep){
    return value != undefined && value.length > 0 ? value + sep : '';
}

所以你的函数变成:

private String convertPsuedoFunctions(String mask)
{
    return 
         "function ifnotempty(value,sep){return value!=undefined&&value.length>0?value+sep:'';}"
         + mask;
}

此外,您可以创建一个包含您支持的一些默认函数的文件,并将其添加到用户脚本中。就像上面一样。但您不是将一个硬编码函数读入一个字符串,而是将该文件读入一个字符串中。

private static final String defaultFunctions = 
     com.google.common.io.Files.toString(new File("functions.js"),Charsets.US_ASCII);

private String convertPsuedoFunctions(String mask)
{
    return defaultFunctions + mask;
}

关于java - 如何使用 Java ScriptEngine 创建 Javascript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11432214/

相关文章:

java - 在 Netbeans 项目中获取文件路径时遇到问题

java - 如何加入Pig输出文件?

java - 检测扬声器是否已插入?

javascript - 创建一个表并在弹出窗口中填充它

Java ScriptEngine 找不到 Javascript 文件引用的模块

java - 通过 Java ScriptEngine 在 JavaScript 中使用 jar

java - 如何查看 Aparapi 生成的 OpenCL 代码

javascript - 至少一个数字的正则表达式

javascript - 纯 JavaScript 淡入淡出 - 淡入不起作用

java - 评估字符串时的错误答案