3

別の beanshell ファイルからインポートされたクラスを実行したいと思います。しかし、メインの beanshell ファイルからクラスをインスタンス化する方法がわかりません。これは可能ですか?

インポートするクラス:

class HelloW {
public void run(){
    print("Hello World");
}
}

クラスを実行してインスタンス化する必要があるメイン Beanshell ファイル:

Interpreter i = new Interpreter();
i.source("HelloW.bsh");
4

1 に答える 1

5

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!
于 2013-01-08T17:26:21.910 に答える