如果我有JTextArea
或类似的东西,是否可以将String
变量发送到我的源代码,这会改变if语句的条件?
这将是我的源代码:
if(condition1 + operation + condition2){
// do something
}
在我的GUI中,我有三个TextAreas:
[Condition1]: "array[i]" or "(array[i]+array[i+1])/2" // what ever
[Operator]: "<" // or >, !=, etc
[Condition2]: "array[i-1]"
感谢您提出任何建议
答案 0 :(得分:0)
你的问题有点神秘,但是你可以有类似的东西。但问题是,您需要找到一种方法来解析用户将提供的任何内容。
您需要建立某种语法,使用您的程序的人需要遵循这些语法以确保它们提供您的程序可以使用的字符串。
您还需要提供某种字典,以便公开可以执行哪些操作,以便您的应用程序知道哪个字符可以解析为什么数学运算符。
答案 1 :(得分:0)
您似乎想要将字符串评估为源代码。它不是,所以这种方法(除了潜在的不安全之外)是行不通的。 您可以将条件和操作数映射到这样的枚举:
public static enum ECondition {
EQ,NE,LT,GT,LE,GE
}
public static enum EVariables {
MY_ARRAY, MY_OTHER_VAR
}
public void eval(ECondition myCondition, EVariables myVar, String myIndex) {
...
if(myVar.equals(EVariables.MY_ARRAY)) {
doSometingToMyArrayAtIndex(myCondition,Integer.parseInt(myIndex), Object /* whatever type it is*/ myReferenceValue);
} else if(myVar.equals(EVariables.MY_OTHER_VAR)) {
doSometingToMyOtherVar(myCondition);
}
}
public void doSometingToMyArrayAtIndex(ECondition cond, Integer index, Object myReferenceValue) {
boolean isConditionTrue = false;
switch(cond) {
case EQ:
isConditionTrue = (myArray[index] == myReferenceValue);
break;
case NE:
isConditionTrue = (myArray[index] != myReferenceValue);
break;
// ... and so on
}
}
另一种方法是使用代码解析器,但我不建议这样做。除了安全,我认为这将是过度杀伤。 但是,如果您想探索解析器方法,请看一下: https://github.com/javaparser/javaparser