java里如何调用js里的方法?

南京_小T
  • 12

java里如何调用js里的方法

// js 代码
STRING_UTIL = {};
STRING_UTIL.isNotEmpty = function (str){
    return "" != str;
}

// java 代码
Reader scriptReaderB = new InputStreamReader(
new FileInputStream(
    new File("F:\\tech-study\\js-comm\\release\\bundle.js")),"utf-8");
      
      
      engine.eval(scriptReaderB);
      // engine.eval(scriptReaderA);
      if (engine instanceof Invocable)  
      {  
          // 调用JS方法  
          Invocable invocable = (Invocable)engine;  
          Object result = invocable.invokeFunction("STRING_UTIL.isNotEmpty", new Object[]{"hahaha"});
          
          System.out.println(result.toString());

      }
// 调用异常
java.lang.NoSuchMethodException: no such method: STRING_UTIL.isNotEmpty
    at com.sun.script.javascript.RhinoScriptEngine.invoke(RhinoScriptEngine.java:286)
    at com.sun.script.javascript.RhinoScriptEngine.invokeFunction(RhinoScriptEngine.java:258)
    at AAAAAAA.main(AAAAAAA.java:29)

// 如果在添加一个全局函数
function isNotEmpty (str){
    return STRING_UTIL.isNotEmpty(str);
}

将调用方法变成

Object result = invocable.invokeFunction("isNotEmpty", new Object[]{"hahaha"});

这样是运行成功的

回复
阅读 5.3k
2 个回答

经过自己的实现,可以使用两种方法来实现:

  1. 使用 engine.eval
    Object result = engine.eval("STRING_UTIL.isNotEmpty('" + str + "')"); 这种方式来调用。

  2. 使用invokeMethod方法来实现
    首先get到对象

Object thiz = engine.get("STRING_UTIL");
接下来根据对象调用方法
Object result = invocable.invokeMethod(thiz, "isNotEmpty", new Object[]{"hahaha"});

再介绍一个本书给大家:《深入理解Java 7:核心技术与最佳实践》
这里面的第二章讲得很详细。有想去的可以取看看

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine javaScript = manager.getEngineByName("JavaScript");
InputStream stream =
                    JS.class.getResourceAsStream("/js/test.js");
BufferedReader reader =
                    new BufferedReader(new InputStreamReader(stream));
javaScript.eval(reader);
invocable = (Invocable) javaScript;
invocable.invokeFunction("method");

invokeFunction 方法说明 第一个参数是方法名,之后的都是方法的参数,返回值是 object 。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏