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容器用戶存儲(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-10
java 如何計(jì)算同比增長(zhǎng)工具類(lèi)
這篇文章主要介紹了java 如何計(jì)算同比增長(zhǎng)工具類(lèi)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
spring 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-02
Springboot 全局日期格式化處理的實(shí)現(xiàn)
這篇文章主要介紹了Springboot 全局日期格式化處理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05

