Java中使用JavaScript腳本的方法步驟
簡(jiǎn)介 Nashorn
Nashorn 一個(gè) javascript 引擎。
從JDK 1.8開(kāi)始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成為Java的嵌入式JavaScript引擎。Nashorn完全支持ECMAScript 5.1規(guī)范以及一些擴(kuò)展。
它使用基于JSR 292的新語(yǔ)言特性,其中包含在JDK 7中引入的 invokedynamic,將JavaScript編譯成Java字節(jié)碼。
與先前的Rhino實(shí)現(xiàn)相比,這帶來(lái)了2到10倍的性能提升。
使用方式
1. 編寫(xiě)JavaScript腳本
列:JavaScript方法使用Java對(duì)象執(zhí)行方法獲取返回值。
function scriptFunction(obj){ var a = 1; var b = 2; return obj.sum(a,b); } scriptFunction(obj);//調(diào)用該方法
該腳本變量定義為 String script1;
2. 創(chuàng)建JavaScript容器用戶(hù)存儲(chǔ)腳本 ScirptContainer.java
public class ScirptContainer { public static ScriptEngine engine;//腳本引擎 static { ScriptEngineManager manager = new ScriptEngineManager();//腳本引擎管理 engine = manager.getEngineByName("nashorn");//獲取nashorn腳本引擎 engine.getContext().getWriter();//獲取正文并且寫(xiě)入 } private ConcurrentHashMap<Integer, CompiledScript> scripts = new ConcurrentHashMap<>();//腳本存儲(chǔ)容器 public CompiledScript getCompiledScript(String script) throws ScriptException{ //判斷腳本是否為空 if(script == null || "".equals(script)){ throw new ScriptException("JavaScript empty"); } //獲取腳本Hash int hashCode = script.hashCode(); //從容器中獲取腳本 CompiledScript compiledScript = scripts.get(hashCode); if(compiledScript == null){ //容器中無(wú)腳本創(chuàng)建腳本對(duì)象 Compilable compilable = (Compilable) engine; //編譯JavaScript腳本 compiledScript = compilable.compile(script); //腳本對(duì)象存入容器中 scripts.put(hashCode, compiledScript); } return compiledScript; } }
3. Java執(zhí)行JavaScript腳本
public class ScriptHandler { //創(chuàng)建容器對(duì)象 private ScirptContainer scirptContainer = new ScirptContainer(); //需要執(zhí)行的對(duì)象 String js1 = "function scriptFunction(obj){ var a = 1; var b = 2; return obj.sum(a,b); } scriptFunction(obj);"; @Test public void test() throws ScriptException{ //獲取腳本對(duì)象 CompiledScript c1 = scirptContainer.getCompiledScript(js1); //創(chuàng)建參數(shù)綁定 Bindings bindings = scirptContainer.engine.createBindings(); //obj參數(shù)綁定SumTest類(lèi) bindings.put("obj", new SumTest()); //執(zhí)行JavaScript腳本并且打印返回值 System.out.println(c1.eval(bindings)); } }
注意事項(xiàng):
- 腳本中scriptFunction(obj);是必須存在,否則不會(huì)執(zhí)行方法.
- 腳本中可以創(chuàng)建Java對(duì)象,需要全類(lèi)名如var map = new java.util.HashMap();
到此這篇關(guān)于Java中使用JavaScript腳本的方法步驟的文章就介紹到這了,更多相關(guān)Java使用JavaScript腳本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
作者: SimpleWu
出處:https://www.cnblogs.com/SimpleWu/p/12598442.html
本站使用「SimpleWu BY 4.0」創(chuàng)作共享協(xié)議,轉(zhuǎn)載請(qǐng)?jiān)谖恼旅黠@位置注明作者及出處。
相關(guān)文章
Java Swing中的文本區(qū)(JTextArea)實(shí)現(xiàn)換行保存到文件的幾個(gè)方法
這篇文章主要介紹了Java Swing中的文本區(qū)(JTextArea)實(shí)現(xiàn)換行保存到文件的幾個(gè)方法,本文給出了4種方法,需要的朋友可以參考下2014-10-10java 如何計(jì)算同比增長(zhǎng)工具類(lèi)
這篇文章主要介紹了java 如何計(jì)算同比增長(zhǎng)工具類(lèi)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07spring boot+spring cache實(shí)現(xiàn)兩級(jí)緩存(redis+caffeine)
這篇文章主要介紹了spring boot+spring cache實(shí)現(xiàn)兩級(jí)緩存(redis+caffeine),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02Springboot 全局日期格式化處理的實(shí)現(xiàn)
這篇文章主要介紹了Springboot 全局日期格式化處理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05