Java SE
運行第一個腳本程序
在使用Java SE
import javax
import java
import java
import static java
public class ListScriptEngines
{
public static void main(String args[])
{
ScriptEngineManager manager = new ScriptEngineManager();
// 得到所有的腳本引擎工廠
List<ScriptEngineFactory> factories = manager
// 這是Java SE
for (ScriptEngineFactory factory: factories)
{
// 打印腳本信息
out
factory
factory
factory
factory
factory
factory
factory
// 得到當前的腳本引擎
ScriptEngine engine = factory
}
}
}
上面的例子必須要在Java SE
通過運行java ListScriptEngines
Name: Mozilla Rhino
Version:
Language name: ECMAScript
Language version:
Extensions: [js]
Mime types: [application/javascript
Names: [js
在最下面一行是腳本的別名
·根據擴展名得到腳本引擎
ScriptEngine engine = manager
getEngineByExtension的參數就是Extensions:[js]中[…]裡的部分
·根據Mime類型得到腳本引擎
ScriptEngine engine = manager
getEngineByMimeType的參數可以是Mime types: [application/javascript
·根據名稱得到腳本引擎
ScriptEngine engine = manager
getEngineByName後的參數可以是Names: [js
上面已經討論了執行腳本的第一步
下面的例子演示了如何使用eval方法來執行javascript腳本
import javax
import java
import static java
public class FirstJavaScript
{
public static void main(String args[])
{
ScriptEngineManager manager = new ScriptEngineManager();
// 得到javascript腳本引擎
ScriptEngine engine = manager
try
{
// 開始運行腳本
Double hour = (Double)engine
String msg;
// 將小時轉換為問候信息
if (hour <
{
msg =
}
else if (hour <
{
msg =
}
else if (hour <
{
msg =
}
else
{
msg =
}
out
}
catch (ScriptException e)
{
err
}
}
}
上面的例子通過得到當前的小時
小時
這個例子最值得注意的是執行的
和腳本語言進行交互
上面例子只是運行了一個非常簡單的腳本
腳本引擎除了這些簡單的功能
put 有兩個參數
get 有一個參數
下面的代碼通過javascript腳本將一個字符串翻轉(這個字符串是通過java傳給javascript的)
import javax
import java
import static java
public class ReverseString
{
public static void main(String args[])
{
ScriptEngineManager manager = new ScriptEngineManager();
// 建立javascript腳本引擎
ScriptEngine engine = manager
try
{
// 將變量name和變量值abcdefg傳給javascript腳本
engine
// 開始執行腳本
engine
// 得到output變量的值
String name = (String)engine
out
}
catch (ScriptException e)
{
err
}
}
}
以上代碼的輸出結果為
讓腳本運行得更快
眾所周知
import javax
import java
import static java
public class CompileScript
{
public static void main(String args[])
{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager
engine
// 判斷這個腳本引擎是否支持編譯功能
if (engine instanceof Compilable)
{
Compilable compEngine = (Compilable)engine;
try
{
// 進行編譯
CompiledScript script = pile(
out
out
out
}
catch (ScriptException e)
{
err
}
}
else
{
err
}
}
}
上面的代碼運行後的顯示信息如下
Counter:
Counter:
Counter:
在這個例子中
動態調用腳本語言的方法
上面的例子只有一個函數
import javax
import java
import static java
public class InvocableTest
{
public static void main(String args[])
{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager
if (engine instanceof Invocable)
{
try
{
engine
Invocable invokeEngine = (Invocable)engine;
Object o = invokeEngine
out
}
catch (NoSuchMethodException e)
{
err
}
catch (ScriptException e)
{
err
}
}
else
{
err
}
}
動態實現接口
腳本引擎還有一個更吸引的功能
engine
Runnable runner = invokeEngine
Thread t = new Thread(runner);
t
下面是實現這個功能的詳細代碼
import javax
import static java
public class InterfaceTest
{
public static void main(String args[])
{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager
try
{
engine
Invocable invokeEngine = (Invocable)engine;
Runnable runner = invokeEngine
Thread t = new Thread(runner);
t
t
}
catch (InterruptedException e)
{
err
}
catch (ScriptException e)
{
System
}
}
}
其實上面的代碼是通過javascript實現了Runnable接口的run方法
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25487.html