-1

可能重复:
将字符串转换为代码

我需要评估一个包含有效 Java 代码的字符串

例如。我应该能够6String code="Math.abs(2*3);";

4

2 回答 2

1

这听起来是一个很有趣的想法,请问您的应用程序的目的是什么?

最好的办法是建立一个你将支持的已知模式的字典。

我的第一个想法是你应该创建一个接受模式的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;
  }
}

此时,您的foundPattern变量中将包含“Math.abs”。

然后,您可以使用您对该方法如何工作的知识来计算它。我想不出一种超级有效的方法,但至少能让你继续前进的基本方法就像一个大的 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.lang. 蠕虫罐头。

于 2012-11-30T10:41:26.080 回答
0

您可以使用Groovy http://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)"));
于 2012-11-30T11:32:23.020 回答