2012-11-30 43 views
-1

可能重複Java代碼:
Convert String to code如何編譯Android中

我需要評估包含有效的Java代碼

如字符串。我應該能夠從String code="Math.abs(2*3);";

+1

什麼???你有沒有Java編程的基礎? – Snicolas

+2

嘗試http://stackoverflow.com/questions/935175/convert-string-to-code – Osiris

+0

爲什麼不直接在Android中編寫它? –

回答

1

這聽起來像是一個非常有趣的想法得到6,我可以問你的應用程序的目的是什麼?

最好的辦法是建立一個你會支持的已知模式的字典。

我的第一個想法是,你應該創建一個ArrayList接受的模式。因此,例如:

ArrayList<String> acceptedPatterns = new ArrayList<String>(); 
acceptedPatterns.add("math.abs"); 
acceptedPatterns.add("math.acos"); 

然後,當你得到字符串的抱着你可以評估這個名單。

String foundPattern = null; 
String myStringFromInput = editText.getText(); 
for (String pattern : acceptedPatterns){ 
    if (myStringFromInput.contains(pattern){ 
    // we have recognised a java method, flag this up 
    foundPattern = pattern; 
    break; 
    } 
} 

在這一點上,你將不得不 「Math.abs」 你foundPattern變量。

然後,您可以使用此方法如何計算它的知識。我想不出一個超級有效的方式,但是這將至少讓你去會像一個大的if/else語句基本途徑:

int result = 0; 
if (foundPattern.contains("Math.abs"){ 
    result = computeMathAbs(myStringFromInput); 
}else if (foundPattern.contains("Math.acos"){ 
    // etc 
} 

,然後在computeMathAbs方法,你能做這樣的事情:

private int computeMathAbs(String input){ 
    int indexOfBracket = input.indexOf("("); 
    int indexOfCloseBracket = input.indexOf(")"); 
    String value = input.subString(indexOfBracket,indexOfCloseBracket); 
    int valueInt = computeFromString(value); 
    int result = Math.abs(valueInt); 
    return result; 
} 

然後,您可以顯示傳回的結果。

computeFromString()方法將做類似的事情,尋找*符號或其他符號和車削到這一點,如ABS例子的乘法。

顯然這是一個基本的例子,所以你一次只能計算一個java方法,一次一個以上的方法的複雜性對於我的編程來說相當困難。

您還需要進行相當多的錯誤處理,並且認識到用戶可能不會輸入完美的java。可以蠕蟲。

0

您可以使用Groovyhttp://groovy.codehaus.org/api/groovy/util/Eval.html

import groovy.util.Eval; 

... 

    HashMap<String, Object> params = new HashMap<String, Object>(); 
    params.put("a", 2); 
    params.put("b", 3); 

    Integer res = (Integer) Eval.me("param", params, "Math.abs(param.a * param.b)"); 

    System.out.println("res with params = " + res); 

    System.out.println("res without params = " + Eval.me("Math.abs(2*3)"));