从java代码调用外部javascript函数

通过使用Java Scripting API,我能够在Java中执行JavaScript。 但是,有人可以解释我需要添加到此代码中的内容,以便能够调用C中的函数:/Scripts/Jsfunctions.js

import javax.script.*; public class InvokeScriptFunction { public static void main(String[] args) throws Exception { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); // JavaScript code in a String String script1 = (String)"function hello(name) {print ('Hello, ' + name);}"; String script2 = (String)"function getValue(a,b) { if (a===\"Number\") return 1; else return b;}"; // evaluate script engine.eval(script1); engine.eval(script2); Invocable inv = (Invocable) engine; inv.invokeFunction("hello", "Scripting!!" ); //This one works. } } 

使用ScriptEngine.eval(java.io.Reader)来读取脚本

 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); // read script file engine.eval(Files.newBufferedReader(Paths.get("C:/Scripts/Jsfunctions.js"), StandardCharsets.UTF_8)); Invocable inv = (Invocable) engine; // call function from script file inv.invokeFunction("yourFunction", "param"); 
 try { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); System.out.println("okay1"); FileInputStream fileInputStream = new FileInputStream("C:/Users/Kushan/eclipse-workspace/sureson.lk/src/main/webapp/js/back_end_response.js"); System.out.println("okay2"); if (fileInputStream != null){ BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); engine.eval(reader); System.out.println("okay3"); // Invocable javascriptEngine = null; System.out.println("okay4"); Invocable invocableEngine = (Invocable)engine; System.out.println("okay5"); int x=0; System.out.println("invocableEngine is : "+invocableEngine); Object object = invocableEngine.invokeFunction("backend_message",x); System.out.println("okay6"); } }catch(Exception e) { System.out.println("erroe when calling js function"+ e); } 

让我们说你的jsfunctions.js文件有一个“显示”function,这个文件存储在C:/Scripts/Jsfunctions.js

jsfunctions.js

 var display = function(name) { print("Hello, I am a Javascript display function",name); return "display function return" } 

现在,在您的Java代码中,我建议您使用Java8 Nashorn。 在你的java类中,

 import java.io.FileNotFoundException; import java.io.FileReader; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; class Test { public void runDisplay() { ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); try { engine.eval(new FileReader("C:/Scripts/Jsfunctions.js")); Invocable invocable = (Invocable) engine; Object result; result = invocable.invokeFunction("display", helloWorld); System.out.println(result); System.out.println(result.getClass()); } catch (FileNotFoundException | NoSuchMethodException | ScriptException e) { e.printStackTrace(); } } } 

注意:获取javascript文件的绝对路径并在FileReader()中替换并运行java代码。 它应该工作。