BeanShellのドキュメントはこの分野で非常に優れているため、最初にそれを読む必要があります。あなたの場合、問題はほとんどありません。そうは言っても、スクリプト化されたオブジェクトがあります。また、開始する .bsh ファイルは、スクリプト化されたオブジェクトを実行する必要があります。あなたの例を取ると、このコードはうまくいくはずです:
Hello() {
run(){
print("Hello World");
}
return this;
}
myHello = Hello();
myHello.run(); // Hello World
*スクリプト化されたクラスをサポートするバージョン BeanShell 2.0b1 以降の更新された回答 * :
2 つの beanshell ファイルを作成し、ディレクトリ「scripts」に配置しました。
最初の「executor.bsh」は、あなたが「親」スクリプトと呼んでいるものだと思います。
// executor.bsh
addClassPath(".");
importCommands("scripts");
source(); // This runs the script which defines the class(es)
x = new HelloWorld();
x.start();
2 番目のファイルには、スクリプト化されたクラスが含まれています。スクリプト コマンドを使用していることに注意してください。BeanShell のドキュメントによると、ファイル名はコマンド名と同じでなければなりません。
// source.bsh
source() {
public class HelloWorld extends Thread {
count = 5;
public void run() {
for(i=0; i<count; i++)
print("Hello World!");
}
}
}
次のようにJavaクラスでexecutor.bshを呼び出しました。
Interpreter i = new Interpreter();
i.source("scripts/executor.bsh");
// Object val = null;
// val = i.source("scripts/executor.bsh");
// System.out.println("Class:" + val.getClass().getCanonicalName());
// Method m = val.getClass().getMethod("start", null);
// m.invoke(val, null);
リフレクションを使用して Java からスクリプト化されたクラスを実行していることも示す、コメント付きのコードをいくつか残したことに注意してください。そして、これは結果です:
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!