beanshellスクリプト

9401 ワード

くどい紹介を始める
今では多くのスクリプト言語がありますが、皆さんが普段使っているのはPerl、Python、Ruby、Javascript、Groovyです.ここでは別のオブジェクトスクリプト言語BeanShell(http://www.beanshell.org).
BeanShellの解釈器はJavaで書かれていて、オープンソースで無料です.Open-openの上の言葉を参照して、その動作方法を説明します.「スクリプト化されたオブジェクトを単純な閉パッケージ方法(simple method closure)と見なします.PerlやJavaScriptのようにサポートされています.Java反射APIを使用してJava文と式のリアルタイム解釈実行を提供するという特徴があります.任意のJavaオブジェクトとAPIに透過的にアクセスできます.コマンドラインモード、コンソールモード、ウィジェットモード、リモートスレッドサーバモードの4つのモードの下で実行できます.アプリケーションと同様に、コンパイラやクラスマウンタを必要とせずに、小さなプログラム(Applet)で正常に動作します.非常にシンプルな解釈器jarファイルサイズは175 k」です.各スクリプト言語にはその使用シーンがあり、あるシーンでの使用によって言語自体が大きくなった.例えばRuby On RailsというWebフレームワークの流行によって開発者の注目を集めている.Groovyも同じだ.BeanShellはもうWebフレームワークができません.Java世界のWebフレームワークはもう多すぎて、頭が痛いです.
 
BeanShellはJava文法なので、Java開発者にとって、すぐに上手になります.BeanShellはRuby、Perl、Rubyのようにシステムの本体を占めることはできませんが、小さな場所で「ねじ」の役割を果たすしかありません.
 
BeanShellを使用すると、現実の不規則な業務を処理できます.典型的な例を挙げると、保険会社には多くの保険種があり、各保険種の投入と収益のアルゴリズムは複雑で、規則的な関係データベースモデルでは説明できません.そのため、多くの保険システムは保険種を処理するアルゴリズムがハードコーディングであり、システムに新しい保険種を追加する場合は、非常に面倒で、コードを再修正して、再配布して、これは開発メンテナンス人員と取引先に対してすべてとても苦痛で、BeanShellがあって、私達はこのような苦痛の中から解放することができて、すべての危険種に対して異なるスクリプトを使って、新しく加えた危険種は私達は新しいスクリプトを配合して、このように業務の多変の要求を満たすことができて、また仕事量を減らすことができて、コストを節約します.BeanShellの1つの特徴は、Javaコードを動的に実行することであり、スクリプトファイルの変更は現在のスクリプトの呼び出しに影響を与えず、新しいスクリプトはスクリプトの次の呼び出しで有効になります.これはプロファイルとは異なり、プロファイルの変更は一般的に再起動を適用する必要があります.
 
BeanShellの構成
1.bsh-xx.JArファイルは$JAVA_に置くHOME/jre/lib/extのフォルダの下に拡張としてインストールします.(OSXユーザー:bsh.jarファイルを/Library/Java/Extensionsまたは~/Library/Java/Extensionsに配置して個々のユーザーが使用する)
2、add BeanShell to your classpath like this:
unix:export CLASSPATH=$CLASSPATH:bsh-xx.jar
windows:set classpath %classpath%;bsh-xx.jar
 
BeanShellのGUIまたはコマンドラインモードの実行
1、java bsh.Console//グラフィックスデスクトップウィンドウの実行(jdk 1.6.0_23の場合、bsh-bsf-xx.jarをE:Program FilesJavajdk 1.6.0_23jrelibextの下に置く必要があります.そうしないとグラフィックスインタフェースは開かれません)
2、java bsh.Interpreter//コマンドラインでテキストとしてのみ実行
3、java bsh.Interpreter filename[args]//スクリプトファイルの実行
4、リモートコール:
import bsh.Interpreter;
Interpreter i = new Interpreter();
i.eval("server(1234)"); //       :1234

リモートクライアントアクセス
ブラウザ:http://yourserver:/remote/jconsole.html
telnet:telnet
 
一般的なBeanShellコマンド
BeanShellに組み込まれた便利なコマンドprint()で、変数の値を表示します.print()とavaのSystem.out.println()は、出力が常にコマンドラインであることを保証できない限り、非常に似ています.print()は、Javaよりも詳細なオブジェクトのタイプ(配列など)も表示できます.もう1つの関連コマンドはshow()で、入力した各行の結果を表示するためにオフにします.
一般的なコマンド:
source(),run()-bshスクリプトを解釈器に読み込むか、別の解釈器で実行します.
frame()-FrameまたはJFrameのGUIコンポーネントを表示します.
load(),save()-シーケンス化されたオブジェクトをファイルにロードおよび保存
cd(),cat(),dir(),pwd(),etc.-クラスunixのshellコマンド
exec()-ローカルのプログラムを実行
JAvap()-Javaのjavapコマンドに似たオブジェクトを印刷する方法とフィールド
setAccessibility()-無制限アクセスprivateとprotectedのコンポーネントを開く
詳細については、BeanShellコマンドの詳細リストを参照してください.
 
あなたのアプリケーションでは、BeanShellの解釈器を作成し、eval()コマンドとsource()コマンドを使用してテキストに値を付けたり、スクリプトを実行したりします.set()メソッドで変数の参照をスクリプトで使用したいオブジェクトに渡し、get()メソッドで結果を取得できます.
 
文と式
BeaShellは、標準的なJava文、式、メソッド宣言を理解します.文と式はJavaメソッドの中で最も基本的なものです.例えば、変数の宣言と付与、メソッド呼び出し、ループ、条件文などです.Javaのように使用できます.もちろん、BeanShellでは、「loosely typed(松のタイプ)」変数(松のタイプの役割ドメインはグローバルとして定義されています)を使用する機会が増えています.すなわち、メタタイプやオブジェクトタイプを含む変数タイプを省略することができます.変数タイプを悪用すると、BeanShellは例外を放出します.
foo = "Foo";
four = (2 + 2) * 2 / 2;
print( foo + " = " + four );

for (i=0; i<5; i++)
	print(i);   

button = new JButton( "My Button" );
frame = new JFrame( "My Frame" );
frame.getContentPane().add( button, "Center" );
frame.pack();
frame.setVisible(true);

 
スクリプトメソッド
Javaのclassのように宣言して使用することができます.
int addTwoNumbers( int a, int b ) {
    return a + b;
}
sum = addTwoNumbers( 5, 7 );  //   :12

// Bsh        (    )       
add( a, b ) {
    return a + b;
}
foo = add(1, 2);            //   :3
foo = add("Oh", " baby");   //   :"Oh baby"

 
スクリプト・オブジェクト
BeanShellでは、JavaScriptやPerlのように、メソッド「閉パッケージ」でスクリプトオブジェクトを作成できます.メソッドに特殊な値thisを返すことで、このメソッドで呼び出された戻り値をオブジェクト参照にすることができます.メソッド呼び出し中に、この参照を使用して任意の変数セットを指すことができます.有用なオブジェクトにはもちろんメソッドが含まれているので、BeanShellスクリプトメソッドには任意のレベルでメソッドを含めることができます.
foo() {
    print("foo");
    x=5;

    bar() {
        print("bar");
    }

    return this;
}

myfoo = foo();    // prints "foo"
print( myfoo.x ); // prints "5"
myfoo.bar();      // prints "bar"

 
実装インタフェース
BeanShellの最も強力な機能の一つは、Javaインタフェーススクリプトを作成する能力です.この機能を使用すると、イベント処理、リスニング、その他のJava APIのコンポーネントとしてスクリプトを作成できます.スクリプト化されたコンポーネントをアプリケーションから簡単に呼び出すこともできます.他のJavaオブジェクトと見なすことができるからです.
スクリプトのコンポーネントを取得してJavaインタフェースを実装する方法の1つは、標準的なJava匿名内部クラスを使用してスクリプトのオブジェクトを構築するインタフェースタイプの構文です.
buttonHandler = new ActionListener() { //      ActionListener buttonHandler = new ActionListener()
  actionPerformed( event ) {
    print(event);
  }
  invoke( name, args ) { print("Method: "+name+" invoked!"); //     ActionListener actionAftered()  ,        ,    invoke()     
};
button = new JButton();
button.addActionListener( buttonHandler );
frame(button);

上記の例では、「ActionListener」インタフェースを実装し、「buttonHandler」という変数を付与するオブジェクトを作成しました.「buttonHandler」オブジェクトには、インタフェース上のメソッド呼び出しを処理するために呼び出されるスクリプトメソッド「actionPerformed()」が含まれます.
インタフェースを実装するには、1つのインタフェースのすべての方法を実装する必要があります.呼び出したい方法をスクリプトに書くことができます.定義されていないメソッドを要求しようとすると、呼び出されたコードは例外を放出しやすくなります.スクリプト・オブジェクト上で、invoke(name,args)という特定のメソッド署名を実装できます.invoke()メソッドを呼び出して、未定義のメソッド呼び出しを処理します.
まとめ:
スクリプトインタフェースは、スクリプトメソッドを検索することによってインタフェースメソッドを実現する方法で動作します.Javaメソッドがスクリプトを呼び出してインタフェースを実装すると、BeanShellは署名(名前と変数タイプ)を一致させることで対応するスクリプトメソッドを探します.BeanShellは次にメソッドを呼び出し、パラメータを渡し、戻り値を渡します.BeanShellが別のコードとして同じJava仮想マシン上で実行されると、パラメータと戻り値として「生きている」Javaオブジェクトを自由に渡し、スクリプトで動的に動作させることができます.シームレスな統合です.
 
invoke()メタメソッド
BeanShellは、多くのメソッドを持つスクリプトインタフェースに非常に簡単な速記メカニズムを提供します.任意のスクリプトコンテキストで特殊なメソッドinvoke(name,args)を実装できます.invoke()メソッドは、定義されていないインタフェースの任意のメソッドの呼び出しを処理するために呼び出される.
invoke(name,args) { print("Command: "+name+" invoked!"); }
noSuchMethod(); //    "Command: noSuchMethod() invoked!"
noSuchMethodメソッドが定義されていないため、invokeメソッドによって統一的に処理される.
 
JAva呼び出しBeanShell
例1:
import bsh.Interpreter;

Interpreter i = new Interpreter(); //    interpreter

i.set("foo", 5); //     
i.set("date", new Date() );

Date date = (Date)i.get("date"); //     

//           
i.eval("bar = foo*10");
System.out.println( i.get("bar") );

//            
i.source("somefile.bsh");

実行:
  beanshell脚本
説明:
クラスInterpreterはBeanShellのスクリプト解釈器です.1つのInterpreterインスタンスを使用して、スクリプトのソースコードを取得し、文または式を評価できます.API参照http://www.beanshell.org/javadoc/index.html.
 
例2:
        myscript.txt ,    :
a = 2;b = 3;c = a + b;print(c);
     
c:\beanshell>java bsh.Interpreter myscript.txt
OK,    5
   bat   bsh.bat       , :winnt       :
java bsh.Interpreter %1
                
c:\beanshell>bsh myscript.txt

 
例3:
「somefile.bsh」というファイル名のBeanShellスクリプトをJEditで編集します.Interpreterを使用します.ソース(bshファイル)メソッドはBeanShellのリソースに呼び出すことができる.
beanshell脚本
BeanShellワークスペースを使用して、「somefile.bsh」のスクリプトファイルを呼び出します.現在のインスタンスの両方が同じディレクトリにあるコールパスに注意してください.
beanshell脚本
実行結果:

 
例4:
BeanShellは、Java 1.5で強化されたforループをサポートし、コレクションと配列タイプを反復します.
beanshell脚本