首先查看一下jvm當前支持了哪些腳本引擎,當前使用的是jdk6版本 javascript
ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); List<ScriptEngineFactory> engineFactories = scriptEngineManager.getEngineFactories(); if (engineFactories.size() == 0) { System.out.println("本JVM尚不支持任何腳本引擎"); return; } System.out.println("本JVM支持的腳本引擎有:"); for (ScriptEngineFactory engineFactory : engineFactories) { System.out.println("引擎名稱:" + engineFactory.getEngineName()); System.out.println("\t可被ScriptEngineManager識別的名稱:"+ engineFactory.getNames()); }結果:
本JVM支持的腳本引擎有: 引擎名稱:Mozilla Rhino 可被ScriptEngineManager識別的名稱:[js, rhino, JavaScript, javascript, ECMAScript, ecmascript]能夠知道jvm默認是支持JavaScript腳本的,固然jvm提供了相應的接口,是能夠接入第三方腳本引擎的,好比Python, Expression Language等支持。當前引用了jython.jar,jython-engine.jar,jexl.jar,從新查看支持的引擎。
本JVM支持的腳本引擎有: 引擎名稱:Mozilla Rhino 可被ScriptEngineManager識別的名稱:[js, rhino, JavaScript, javascript, ECMAScript, ecmascript] 引擎名稱:jython 可被ScriptEngineManager識別的名稱:[jython, python] 引擎名稱:JEXL Engine 可被ScriptEngineManager識別的名稱:[JEXL, Jexl, jexl, JEXL2, Jexl2, jexl2]
好了,既然jvm能夠擴展支持這麼多腳本,下面舉幾個實際運用的例子: java
1.好比有這樣的需求,有一個給玩家的獎勵是要根據玩家等級(level)進行計算的,好比須要把100*level,這裏咱們可使用兩種方式來解決:
第一種:在代碼裏面寫死,判斷當是指定獎勵的時候*level
第二種:使用表達式,而後使用引擎執行表達式,看下面的例子,使用JavaScript引擎: python
ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("javascript"); String exp = "100 * level"; scriptEngine.put("level", 4); Object result = scriptEngine.eval(exp); System.out.println(exp + " = " + result);這樣咱們就能夠將咱們的獎勵表達式,交給一個表達式處理器統一處理。這裏咱們是利用了JavaScript能夠執行表達式的功能,固然能夠利用更專業的表達式執行引擎jexl,性能會更好。
ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("jexl");
2.還有更復雜的需求,就是戰鬥系統,不單單是解析表達式了,須要更多的邏輯,好比最經常使用的計算傷害,須要一個很複雜的邏輯,而這個邏輯最清楚的是策劃,因此咱們經過提供接口,而後由腳原本實現,咱們的程序只負責調用就好了。 ecmascript
好比這個接口由Python來實現:def increaseHp(attackUnit,defenceUnit,skill,buff,type):#attackUnit 技能釋放者,defenceUnit 技能中招者,skill 技能,buff ,type 1=求數值 2=求描述 ....省略經過一系列的參數最後計算出傷害。
def addition(num1,num2): return num1+num2;
ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("python"); String jsFileName = "scripts/test.py"; // 讀取py文件 FileReader reader = new FileReader(jsFileName); // 執行指定腳本 engine.eval(reader); if (engine instanceof Invocable) { Invocable invoke = (Invocable) engine; Integer c = (Integer) invoke.invokeFunction("addition", 2, 3); System.out.println("c = " + c); }好了,暫且就介紹這兩種需求了,確定還有運用在其餘的地方的需求。
忘了說了腳本好比JavaScript,Python,lua,都是解釋執行的,不須要編譯,全部如今遊戲中常常用腳原本實現熱更新。 jvm