之前在文章 🔗java执行appleScript脚本 中提到可以通过 scriptManager 调用 javascript 方法,其实调用 js 文件中定义好的方法也是可以的。譬如定义个 test.js 文件并放到项目的 resource 目录下:

function sum(a, b)
{
	return a + b;
}

        scriptManager 完整代码如下:

public static void main(String[] args) throws IOException, NoSuchMethodException
{
    URL url = Test.class.getClassLoader().getResource("test.js");

    System.out.println("-------script engine-------");
    ScriptEngineManager engineManager = new ScriptEngineManager();
    ScriptEngine engine = engineManager.getEngineByName("javascript");
    try {
        FileReader reader = new FileReader(url.getPath());
        engine.eval(reader);
        Invocable jsInvoke = (Invocable) engine;
        Object res = jsInvoke.invokeFunction("sum", new Object[]{5, 4});
        System.out.println("res: " + res);
    } catch (ScriptException e) {
        System.out.println("exception: " + e.getMessage());
    }
}

        运行后在控制台就能看到相应结果了,实际上还可以通过 j2v8 来调用 javascript 方法。j2v8 是一组用于 Google 的流行 javascript 引擎 v8java 绑定,目的是为了能在 android 端高效地执行 javascript,因为 android 端是不支持 scriptManage 的。此外移动应用框架 tabris.js 也是基于 j2v8 开发的。可以在 🔗github链接 查看更多。

         实现代码如下:

public static void main(String[] args) throws IOException
{
    URL url = Test.class.getClassLoader().getResource("test.js");
    
    System.out.println("-------j2v8-------");
    V8 runtime = V8.createV8Runtime();
    runtime.executeScript(readFileAsString(url.getPath()));
    Object v8Res = runtime.executeJSFunction("sum", new Object[]{3, 4});
    System.out.println("v8 res: " + v8Res);

    runtime.release();
}

        这里调用了一个自定义的 readFileAsString() 方法,实现如下:

public static String readFileAsString(String filePath) throws java.io.IOException 
{
    StringBuffer fileData = new StringBuffer();
    BufferedReader reader = new BufferedReader(new FileReader(filePath));
    char[] buf = new char[1024];
    int numRead = 0;
    while ((numRead = reader.read(buf)) != -1) {
        String readData = String.valueOf(buf, 0, numRead);
        fileData.append(readData);
        buf = new char[1024];
    }
    reader.close();
    
    return fileData.toString();
}

        运行后控制台也就打印出对应结果啦!以上,欢迎交流~

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐