2013-01-08 91 views
1

我想運行從不同的beanshell文件導入的類。但我不知道如何從主beanshell文件實例化類。這可能嗎?我可以實例化來自另一個Beanshell腳本的beanshell類嗎?

類,我輸入:

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

主要BeanShell的文件,它應該運行和實例類:

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

回答

3

BeanShell documentation在這方面還不錯,所以你應該通過先讀。在你的情況下,幾乎沒有問題。也就是說,有腳本對象。另外,您開始的.bsh文件需要執行腳本對象。以你的例子此代碼應工作:

Hello() { 
run(){ 
    print("Hello World"); 
} 

return this; 
} 

myHello = Hello(); 
myHello.run(); // Hello World 

* 更新的版本的BeanShell 2.0b1的答案,後來支持腳本類*

我創建了兩個BeanShell的文件,並將它們放置在一個目錄下的「腳本」。

我相信第一個「executor.bsh」就是你所說的「父母」腳本。

// executor.bsh 

addClassPath("."); 
importCommands("scripts"); 

source(); // This runs the script which defines the class(es) 

x = new HelloWorld(); 
x.start(); 

第二個文件包含腳本類。請注意,我正在使用腳本命令,並且根據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! 
+0

對不起,但你誤解了我的問題,這個類你好在分離的bsh文件中,我用「Interpreter」調用它。 – PotOfTea

+0

嗯。我希望你把我在HelloW.bsh中給出的代碼放在你的問題中。如果你這樣做,它將實例化腳本對象並調用run方法。你給Interpreter的文件必須是某種腳本並執行一個動作。調用'source()'方法與調用'eval()'相同,除了腳本來自文件而不是字符串。 – GaryMcM

+0

好的謝謝我明白了,我認爲沒有辦法在父級bsh文件中運行方法或實例化類(基本上導入帶有類的文件)? – PotOfTea

相關問題