java引擎組件_Java 腳本引擎入門

Java Script Engine

Java 腳本引擎可以將腳本嵌入Java代碼中,可以自定義和擴展Java應用程序,自JDK1.6被引入,基于Rhino引擎,JDK1.8后使用Nashorn引擎,支持ECMAScript 5,但后期還可能會換。

腳本引擎包位于javax.script中,各個類名及描述如下

接口

Bindings

鍵值對映射,所有key都為String

Compilable

由具體的腳本引擎實現,用于將腳本進行編譯,可重復使用。

Invocable 由具體的腳本引擎實現,其允許調用先前已執行的腳本

ScriptContext

腳本引擎上下文,用于將應用程序與腳本引擎進行綁定

ScriptEngine

由具體的腳本引擎實現,定義了執行腳本的方法、鍵值對映射關系、腳本引擎上下文

ScriptEngineFactory

腳本引擎工廠,每一個ScriptEngine都有一個對應的工廠。ScriptEngineManager會從ClassLoader中獲取所有的ScriptEngineFactories實例

AbstractScriptEngine

ScriptEngine的抽象實現類,提供了ScriptEngine的標準實現

CompiledScript

由存儲編譯結果的類擴展。可以以Java類、Java類文件或者腳本操作碼的形式存儲,可以重復執行無需重新解析。每個CompiledScript都與一個ScriptEngine相關聯,調用CompiledScript的eval方法會導致ScriptEngine執行

ScriptEngineManager

腳本引擎管理器,提供ScriptEngine的實例化機制,并維護了一些鍵/值對集合,供所有創建的ScriptEngine共享使用

SimpleBindings

使用HashMap 或者其他Map實現的一種簡單鍵值映射

SimpleScriptContext

ScriptContext 的一種簡單實現

異常

ScriptException

腳本API的通用異常類,拋出的異常類具有文件名、行號、列號信息

示例

簡單的

@Test

public void scriptTest() throws ScriptException {

ScriptEngineManager engineManager = new ScriptEngineManager();

//獲取JavaScript解析引擎

ScriptEngine engine = engineManager.getEngineByName("JavaScript");

//將x變量映射為Hello World!

engine.put("x", "Hello World!");

engine.eval("print(x)");

}

//輸出

//Hello World!

較復雜的

從文件中讀取腳本

/**

* 從文件中讀取Js腳本

* test.js 中的內容:

* var obj = new Object();

* obj.hello = function (name) {

* print('Hello, ' + name);

* }

* @throws Exception

*/

@Test

public void file() throws Exception{

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("JavaScript");

engine.eval(new FileReader(new File("script/test.js")));

Invocable inv = (Invocable) engine;

Object obj = engine.get("obj");

inv.invokeMethod(obj, "hello", "Script Test!" );

}

將Java變量注入腳本中

有可能需要在腳本中使用Java變量

@Test

public void scriptVar() throws Exception{

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("JavaScript");

File file = new File("F:/test/test.txt");

//將File對象f直接注入到js腳本中并可以作為全局變量使用

engine.put("files", file);

engine.eval("print(files.getPath());print(files.getName());");

}

調用腳本中的方法

使用Invocable 調用已經加載腳本中的方法

@Test

public void scriptTest1() throws ScriptException, NoSuchMethodException {

ScriptEngineManager engineManager = new ScriptEngineManager();

ScriptEngine engine = engineManager.getEngineByName("JavaScript");

StringBuilder sb = new StringBuilder();

sb.append("var obj = new Object();");

sb.append("obj.hello = function(name){print('Hello, ' + name);}");

engine.eval(sb.toString());

//Invocable 可以調用已經加載過的腳本

Invocable invocable = (Invocable) engine;

//獲取腳本的obj對象

Object object = engine.get("obj");

//調用obj對象的hello函數

invocable.invokeMethod(object, "hello", "Script Method!");

}

//輸出

//Hello, Script Method!

多個作用域

一個腳本引擎,多個scope,x變量并沒有覆蓋之前的變量

@Test

public void scriptTest() throws ScriptException {

ScriptEngineManager engineManager = new ScriptEngineManager();

ScriptEngine engine = engineManager.getEngineByName("JavaScript");

engine.put("x", "Hello World!");

engine.eval("print(x)");

ScriptContext context = new SimpleScriptContext();

//新的Script context綁定ScriptContext的ENGINE_SCOPE

Bindings bindings = context.getBindings(ScriptContext.ENGINE_SCOPE);

// 增加一個新變量到新的范圍 engineScope 中

bindings.put("x", "word hello!!");

// 執行同一個腳本 - 但這次傳入一個不同的script context

engine.eval("print(x);", bindings);

engine.eval("print(x);");

}

//輸出

//Hello World!

//word hello!!

//Hello World!

使用腳本實現Java接口

@Test

public void runnableImpl() throws Exception{

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("JavaScript");

// String里定義一段JavaScript代碼腳本

String script = "function run() { print('run called'); }";

// 執行這個腳本

engine.eval(script);

// 從腳本引擎中獲取Runnable接口對象(實例). 該接口方法由具有相匹配名稱的腳本函數實現。

Invocable inv = (Invocable) engine;

// 在上面的腳本中,我們已經實現了Runnable接口的run()方法

Runnable runnable = inv.getInterface(Runnable.class);

// 啟動一個線程運行上面的實現了runnable接口的script腳本

Thread thread = new Thread(runnable);

thread.start();

Thread.sleep(1000);

}

如果腳本是基于對象的,則可以通過執行腳本的方法來實現Java接口,避免調用腳本的全局函數。

@Test

public void runnableObject() throws ScriptException {

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("JavaScript");

String script = "var obj = new Object();obj.run = function() {println('run method called')}";

engine.eval(script);

//獲得腳本對象

Object object = engine.get("obj");

Invocable invocable = (Invocable) engine;

Runnable runnable = invocable.getInterface(object, Runnable.class);

Thread thread = new Thread(runnable);

thread.start();

Thread.sleep(1000);

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529379.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529379.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python 角度傳感器模擬_python樹莓派紅外反射傳感器

本文實例為大家分享了python樹莓派紅外反射傳感器的程序,供大家參考,具體內容如下1、工具rpi3,微雪ARPI600,Infrared Reflective Sensor2、基本原理Infrared Reflective Sensor 輸出數字和模擬信號模擬信號通過ARPI600上的AD轉換芯…

JAVA awt eventqueue_線程“AWT-EventQueue-1”中的異常java.lang.NullPointerException

嗨,我收到錯誤Exception in thread "AWT-EventQueue-1" java.lang.NullPointerExceptionat P6.itemStateChanged(P6.java:215)at javax.swing.AbstractButton.fireItemStateChanged(AbstractButton.java:2023)at javax.swing.AbstractButton$Handler.item…

java構造方法賦值內存圖_java 面向對象(九):類的結構:構造器(一)簡介;屬性賦值順序;JavaBean的概念...

1.構造器(或構造方法):Constructor構造器的作用:* 1.創建對象* 2.初始化對象的信息2.使用說明:* 1.如果沒顯式的定義類的構造器的話,則系統默認提供一個空參的構造器* 2.定義構造器的格式:權限修飾符 類名(形參列表){}…

java 集合modcount_源碼|jdk源碼之LinkedList與modCount字段

鏈表是對上一篇博文所說的順序表的一種實現。與ArrayList思路截然不同,鏈表的實現思路是:不同元素實際上是存儲在離散的內存空間中的。每一個元素都有一個指針指向下一個元素,這樣整個離散的空間就被“串”成了一個有順序的表。從鏈表的概念來…

idea 新建ssm java ee_IDEA搭建SSM項目實現增刪改查

首先打開IDEA,File—>New—>Project創建項目選擇左側導航欄里的Maven,勾上勾,選擇webapp按如下圖進行填寫創建完成后進入項目,右下角彈出的提示點擊右邊的Enable Auto-Import,自動配置連接數據庫,我用…

php mail centos_centos怎么發送郵件

一、安裝sendmail與mail1、安裝sendmail:1) centos下可以安裝命令:yum -y install sendmail2) 安裝完后啟動sendmail命令:service sendmail start2、安裝mail安裝命令:yum install -y mailx二、發送郵件1、通過文件內容發送發送命…

php文件的作用,php入口文件的作用-PHP問題

php入口文件的作用php入口文件能夠完成主動加載性能。解析PHP入口文件的主動加載性能php的主動加載:正在php5之前,咱們要用某個類或類的辦法,那必需include或許require,之后能力應用,每一次用一個類,都需求…

emacs php 配置文件,如何配置emacs進行正確的PHP開發?

我使用web模式(http://web-mode.org/)混合HTML / PHP文件和php模式為純PHP文件.最新版本的php-mode還推薦使用混合HTML / PHP文件的Web模式:https://github.com/ejmr/php-mode#avoid-html-template-compatibility.不同于其他模式,如mmm模式,mumamo或多網絡模式,嘗試…

php 5.3.9 漏洞,PHP-5.3.9遠程執行任意代碼漏洞(CVE-2012-0830) 詳解

這個新的修復方法初衷是好的, 但是卻帶來一個嚴重的問題(5.3.10中已經修復), 這個問題最初是由Stefan Esser發現的. 請看之前(5.3.9)最終的修復方案(php_register_variable_ex):代碼如下while (1) {if (zend_symtable_find(symtable1, escaped_index, index_len 1, (void **) …

java中隨機數邊界問題,java 簡單Dice問題(隨機數的運用)

[java]代碼庫/*** Dice Write a program that simulates rolling two dice using the following* steps: 1. Prompt the user for the number of sides for two dice. 2. “Roll” the* dice three times by generating a random number between 1 (inclusive) and the* number…

php 正則替換 ubb,php實現過濾UBB代碼的類

本文實例講述了php實現過濾UBB代碼的類。分享給大家供大家參考。具體如下:PHP代碼如下:class Day{function ubb($Text) { /// UBB代碼轉換//$Texthtmlspecialchars($Text);//$Textereg_replace("\r\n","",$Text);$Textereg_rep…

java單詞測試,java單詞 - 在線打字測試(dazi.kukuw.com)

java單詞貢獻者:15533470608類別:英文 時間:2018-08-04 22:32:16 收藏數:20 評分:0返回上頁舉報此文章請選擇舉報理由:廣告/謠言/欺詐政治敏感色情/違法信息垃圾文章其他收藏到我的文章改錯字public static…

java vector list,Java基礎之:List——ArrayList Vector

Java基礎之:List——ArrayList & VectorArrayList簡單介紹ArrayList實現了List接口,底層是一個數組,并實現了可變的功能。底層屬性(transient Object[] elementData;)在序列化時,忽略該屬性。ArrayList實現了List接口&#xf…

java建立線性表的鏈式結構,數據結構學習----線性表的鏈式表示(Java實現)

線性表接口LList:package com.clarck.datastructure.linked;/*** 線性表接口LList,描述線性表抽象數據類型,泛型參數T表示數據元素的數據類型** author clarck**/public interface LList {/*** 判斷線性表是否空* return*/boolean isEmpty();…

php prepare 批量,PreparedStatement批處理

PreparedStatement批量更新關鍵代碼 無 import java.sql.Connection;import java.sql.PreparedStatement; //...String sql "insert into employee (name, city, phone) values (?, ?, ?)";Connection connection new getConnection();PreparedStatement pPrepa…

釘釘 php 推送,微信模板推送,釘釘信息推送

上午的時候看到有朋友需要微信推送,正好我也需要,之前一直用 Server 醬的,但是最近用不了,想找一個替代品,一開始準備選擇釘釘,除了打卡,我很少使用釘釘,郵件提醒是備用方案&#xf…

java repaint 重畫圖形,學習筆記:WINDOWS的圖形重繪基礎

OnPaint()與OnDraw()的區別:OnPaint是WM_PAINT的消息響應函數,在MFC的基類里OnPaint函數調用了OnDraw()函數。OnPaint函數另外還調用了OnPrepareDC()函數。如果在窗口子類覆蓋了OnPaint函數,當MFC調用我們重寫的OnPaint函數時,就調…

php定義數據表類,phpwind中的數據庫操作類

phpwind中的數據庫操作類2021-01-22 20:12:15141/*來源:phpwind.net*/ClassDB{var$query_num0;functionDB($dbhost,$dbuser,$dbpw,$dbname,$pconnect0){$this->connect($dbhost,$dbuser,$dbpw,$dbname,$pconnect);}functionconnect($dbhost,$dbuser,$dbpw,$dbnam…

渦輪機葉片matlab強度分析論文,一種基于MATLAB及Pro_E的渦輪建模方法

自動化與控制與二一種基于MATLAB及Pro/E的渦輪建模方法王智明(中海油服油田技術事業部北京1011&am…

基于matlab的傳熱學虛擬實驗開發,基于MATLAB的傳熱學課程虛擬實驗軟件的開發

215教育現代化2018 年 12 月第 49 期 教育信息技術 基于 MATLAB 的傳熱學課程虛擬實驗軟件的開發 周永利,李友榮,石萬元,張力元,楊晨,卞煜,王國強,李俊,包鍵 ( 重慶大學 低品位能源利…