2013-03-27 106 views
7

我想從用戶那裏獲得一行Java代碼並在Android中執行它。例如:是否可以在運行時在Android中執行Java代碼字符串?

String strExecutable = " int var; var = 4 + 3" 
Object obj = aLibrary.eval(strExecutable); 

這不是java腳本,我想運行一個java代碼。

可能嗎?如果是的話如何?

我研究過像this鏈接。但他們是關於JVM而不是Android Dalvik的問題。

+1

Android是一個操作系統。您可以使用JAVA – Blackbelt 2013-03-27 10:39:17

+0

@blackbelt使應用程序爲Android當我們說的Android,我們通常指的Dalvik及其庫 – breceivemail 2013-03-27 11:12:54

+1

我不知道任意的Java代碼,但[這個問題](http://stackoverflow.com/questions/2226863/ whats-a-good-library-for-parsing-mathematical-expressions-in-java)and [this one](http://stackoverflow.com/questions/13747069/is-there-a-mathematical-expression-parsing-圖書館在Android)似乎相似,如果要求只是簡單的數學。 [MVEL](http://mvel.codehaus.org)應該處理你的示例字符串。 – ig0774 2013-03-27 11:29:25

回答

1

你可以嘗試這樣的事情:

// Code Execute, Khaled A Khunaifer, 27 March 2013 
class CodeExcute 
{ 
    public static void execute (String[] commands, String[] headers) 
    { 
     // build commands into new java file 
     try 
     { 
      FileWriter fstream = new FileWriter("Example.java"); 
      BufferedWriter out = new BufferedWriter(fstream); 

      out.write(""); 

      for (String header : headers) out.append(header); 

      out.append("class Example { public static void main(String args[]) { "); 

      for (String cmd : commands) out.append(cmd); 

      out.append(" } }"); 

      out.close(); 
     } 
     catch (Exception e) 
     { 
      System.err.println("Error: " + e.getMessage()); 
     } 

     // set path, compile, & run 
     try 
     { 
      Process tr = Runtime.getRuntime().exec(
       new String[]{ "java -cp .", 
        "javac Example.java", 
        "java Example" }); 
     } 
     catch (Exception e) 
     { 
      System.err.println("Error: " + e.getMessage()); 
     } 

    } 
} 
2

你可以試試BeanShell!這是超級簡單,也適用於Android。只需用jar庫構建你的應用程序。

import bsh.Interpreter; 
private void runString(String code){  
    Interpreter interpreter = new Interpreter(); 
    try { 
     interpreter.set("context", this);//set any variable, you can refer to it directly from string 
     interpreter.eval(code);//execute code 
    } 
    catch (Exception e){//handle exception 
     e.printStackTrace(); 
    } 
} 

但要小心!在生產應用程序中使用此應用程序可能會帶來安全風險,特別是如果您的應用程序與用戶數據/文件交互時,尤其如此。

相關問題