2014-03-05 36 views
2

我正在使用beanshell bsh-2.0b4.jar文件。我已經建立了路徑並在java程序中使用它。我設法從控制檯獲取打印語句。但是,如果正在返回一個值,如何獲得返回值。評估beanshell中的代碼字符串並獲取beanhell解釋器返回的值

import java.io.*; 
import bsh.Interpreter; 
import bsh.EvalError; 
public class CaptureDis { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     Interpreter i = new Interpreter(); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     PrintStream ps2 = System.out; 

     try { 
      //i.eval(System.out.println("System.out.println(\"test\");")); 
      i.eval("int x=2; int y=3; int res=x+y; return res"); 
      i.getOut(); 
     } catch (EvalError e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     String out = baos.toString(); 
     System.setOut(ps2); 
     System.out.println(out); 
    } 

} 

回答

1

我沒有測試腳本返回最後計算的表達式,但我懷疑你缺少了HashSet的import語句。您實際上不需要腳本中的HashSet聲明。由於您在調用之前設置了'hs',所以解釋器知道它。您的腳本應該是這樣的:

srcCode = "for(i=0;i<10;i+=2){ hs.add(i); }"; 

此外,參考你的第一個問題,有你集「HS」調用之前你需要顯式地返回它,最後計算的表達式(HS。 add(i))返回一個布爾值。但是,由於您傳遞了對'hs'的引用,因此根本不需要返回。

0

eval方法返回'res'。實際上,你可以省略return語句在腳本中也如BeanShell的默認

Integer answer = (Integer) i.eval("int x=2; int y=3; int res=x+y; return res"); 
+0

謝謝,它的工作原理。 – user3371303

+0

使用BeanShell解釋器,可以解釋for循環? 我試圖這樣: srcCode載:「HashSet的HS =新的HashSet(); INT I = 0;對於 (I = 0; I <10; I = I + 2){ \t hs.add(ⅰ ); \t}「 and bsh.set(」hs「,hs); bsh.eval(「import java.lang.String;」); bsh.eval(srcCode); 但它給我錯誤「第2行第11列,遇到EOF」 – user3371303