JDK1.6スクリプト言語のサポート(Mozilla Rhino)


JDK 6は、スクリプト言語のサポート(JSR 223)を追加し、原理的にはスクリプト言語をbytecodeにコンパイルすることで、スクリプト言語もJavaプラットフォームの多くの利点を享受することができ、移植性、セキュリティなどが含まれている.また、現在はbytecodeにコンパイルされてから実行されているため、元の説明しながら実行するよりも効率が高い.スクリプト言語のサポートに参加すると、Java言語にも以下のメリットがあります.
1、多くのスクリプト言語にはダイナミックな特性があります.例えば、変数を使用する前に宣言する必要はありません.変数で完全に異なるタイプのオブジェクトを保存することができます.変換は自動的であるため、強制的なタイプ変換を行う必要はありません.Java言語も、スクリプト言語のサポートによって間接的にこの柔軟性を得ることができます.
2、スクリプト言語で製品の原型を迅速に開発することができます.現在はEdit-Runができ、Edit-Compile-Runを必要としないからです.もちろん、Javaには非常に良いIDEサポートがあるので、IDEの中でソースファイルを編集し、実行(コンパイルを隠す)をクリックして、急速に原型を開発する目的を達成することができます.このメリットは基本的に無視できます.
3、スクリプト言語を導入することで簡単にJavaアプリケーションの拡張とカスタマイズを実現することができ、Javaアプリケーションに分布していた構成ロジック、数学式と業務規則を抽出し、JavaScriptを転用して処理することができる.
SunのJDK 6インプリメンテーションにはMozilla Rhinoベースのスクリプト言語エンジンが含まれており、JavaScriptをサポートしています.これはJDK 6がJavaScriptのみをサポートしていることを意味するものではありません.第三者はJSR-223互換のスクリプトエンジンを自分で実現することができ、JDK 6が他のスクリプト言語をサポートすることができます.例えば、JDK 6にRubyをサポートしたいと思っています.では、JSR 223の仕様に従ってRubyのスクリプトエンジンクラスを実現することができます.具体的にはjavaxを実現する必要があります.script.ScriptEngine(簡単に言えばjavax.script.AbstractScriptEngine)とjavaxを継承することができる.script.ScriptEngineFactoryの2つのインタフェース.もちろん、自分のスクリプト言語エンジンを実現する前にscriptingに行きます.dev.java.Netprojectここで仕事を手伝ってくれた人がいるかどうか見てみましょう.そうすれば、直接持ってきて使えます.
Scripting API
--------------------------------------------------------------------------------
Scripting APIは、Javaでスクリプト言語プログラムを記述するためのAPIである、Javax.scriptにはScripting APIがあります.私たちはこのAPIを使ってJavaScriptプログラムを作成しています.このパッケージにはScriptEngineManagerクラスがあります.これはScripting APIを使用するエントリです.ScriptEngineManagerはjarサービス発見(service discovery)メカニズムを通じて適切なスクリプトエンジンクラス(ScriptEngine)を探すことができます.Scripting APIを使用する最も簡単な方法は次の3つだけです.
1、ScriptEngineManagerオブジェクトを作成する
2、ScriptEngineManagerでScriptEngineオブジェクトを獲得する
3、ScriptEngineのevalメソッドでスクリプトを実行する
次はハローワールドプログラムです
** * @author chinajash */  
public class HelloScript {  
public static void main(String[] args) throws Exception{          
    ScriptEngineManager factory = new ScriptEngineManager();//step1          
    ScriptEngine engine =factory.getEngineByName("JavaScript");//Step2              
    engine.eval("print('Hello, Scripting')");//Step3      
}      
} 

上のプログラムを実行すると、コンソールからHelloが出力されます.Scripting上のこの簡単なScriptingプログラムはJavaでスクリプト言語を実行する方法を示しています.それ以外に、Scripting APIを利用して以下の機能を実現することもできます.
1.Javaオブジェクトがスクリプト言語であるグローバル変数を暴露する
2、Javaでスクリプト言語を呼び出す方法
3、スクリプト言語はJavaのインタフェースを実現できる
4、スクリプト言語はJavaのようにJDKプラットフォームの下のクラスを使うことができる
次のクラスでは、上記の4つの機能について説明します.
package Scripting;  
import java.io.File;  
import javax.script.Invocable;  
import javax.script.ScriptEngine;  
import javax.script.ScriptEngineManager;  
import javax.script.ScriptException;  
  
/** * @author chinajash */  
public class ScriptingAPITester {      
public static void main(String[] args) throws Exception{          
    ScriptEngineManager manager = new ScriptEngineManager();          
    ScriptEngine engine = manager.getEngineByName("JavaScript");          
    testScriptVariables(engine);//      Java                       
    testInvokeScriptMethod(engine);//     Java                     
    testScriptInterface(engine);//          Java              
    testUsingJDKClasses(engine);//          JDK           
}          
public static void testScriptVariables(ScriptEngine engine)throws ScriptException{          
    File file = new File("test.txt");          
    engine.put("f",file);          
    engine.eval("println('TotalSpace:'+f.getTotalSpace())");   
}          
public static void testInvokeScriptMethod(ScriptEngine engine) throws Exception{          
    String script = "function hello(name) { return'Hello,' + name;}";          
    engine.eval(script);          
    Invocable inv = (Invocable)engine;          
    String res = (String)inv.invokeFunction("hello","Scripting" );          
    System.out.println("res:"+res);      
}          
public static void testScriptInterface(ScriptEngine engine)throws ScriptException{          
    String script = "var obj = new Object();  
    obj.run = function() { println('run method called');}";          
    engine.eval(script);          
    Object obj =engine.get("obj");          
    Invocable inv = (Invocable)engine;          
    Runnable r =inv.getInterface(obj,Runnable.class);          
    Thread th = new Thread(r);          
    th.start();      
}          
public static void testUsingJDKClasses(ScriptEngine engine) throws Exception{          
    //Packages             ,     JDK package          
    String js = "function doSwing(t){var f=new Packages.javax.swing.JFrame(t);  
    f.setSize(400,300);f.setVisible(true);}";          
    engine.eval(js);          
    Invocable inv = (Invocable)engine;          
    inv.invokeFunction("doSwing", "ScriptingSwing" );      
}  
} //class end;  

ScriptingTool
--------------------------------------------------------------------------------
SUNが提供するJDK 6にはコマンドラインツールjrunscriptがあります./binの下でこのツールを見つけます.jrunscriptはスクリプト言語の解釈プログラムで、スクリプト言語とは独立していますが、デフォルトはJavaScriptです.jrunscriptで自分が書いたスクリプト言語が正しいかどうかをテストすることができます.次はコマンドラインでjrunscriptを実行する簡単な例です.
jrunscript
js>println("Hello,JrunScript");
Hello,JrunScript
js>9*8
72.0
js>
Rihnoの紹介:ご覧いただけます
Rhino--javaベースのjavascript実装
http://www.cnblogs.com/cczw/archive/2012/07/16/2593957.html