我尝试了this thread中给出的示例 使用BeanShell动态创建if语句。但它没有正常工作。我没有使用“age”变量作为整数,而是在下面的示例中使用了string。我作为答案“失败”而不是“成功”。
任何人都可以帮助我吗?
/*
To change this template, choose Tools | Templates
and open the template in the editor.
*/
import java.lang.reflect.*;
import bsh.Interpreter;
public class Main {
public static String d;
public static void main(String args[])
{
try {
String age = "30";
String cond = "age==30";
Interpreter i = new Interpreter();
i.set("age", age);
System.out.println(" sss" + i.get("age"));
if((Boolean)i.eval(cond)) {
System.out.println("success");
} else {
System.out.println("fail");
}
}
catch (Throwable e) {
System.err.println(e);
}
}
}
谢谢, 玛尼
答案 0 :(得分:1)
您必须选择数字比较或字符串比较。这需要使用兼容的条件和年龄类型。
数值:
int age = 30;
String cond = "age==30";
字符串:
String age = "30";
String cond = "age.equals(\"30\")";
答案 1 :(得分:0)
当您使用==运算符比较两个对象时,您将比较两个引用。你实质上是在询问两个不同的名称是否指向内存中的同一个对象。
要比较对象的实际值,您需要使用equals()
方法。这对于理解Java非常重要。
答案 2 :(得分:0)
您正在使用==
来比较字符串类型。请尝试使用age.equals("30")
。
编辑:显示正常工作
如果您将其用作cond
的定义:
String cond = "age.equals(\"30\")";
输出:
sss30
success
回答有关使用=="30"
的问题,以下是答案:
如果你的String age
被实习,因为它是一个编译时常量,那么可以为真。
final String age = "30";
但是,如果你明确地new
String
或者它没有被实习,那么它将是假的。
String age = new String("30");
您可以运行这两个示例以查看此效果。可能 - 你可能会得到fail
。
现在,仅仅因为存在实习并不意味着应该依赖它来比较String
类型。 ==
运算符只应用于比较基元,并比较引用类型以查看它们是否指向同一个对象,因此对于引用类型,我们可以说它看到两个对象是否相同而不是相等。
有时通过JVM和JDK的魔力,String
和其他原始包装器(如Integer
)可能与==
相当,但这种情况有限且不可靠。< / p>
答案 3 :(得分:0)
@Matthew Flaschen是正确的。另外,您可以按如下方式简化输出:
System.out.println(cond + " is " + i.eval(cond));
产生
年龄== 30是真的
答案 4 :(得分:0)
字符串与&#34; ==&#34;在bsh解释器中没有像预期的那样工作。
它的工作原理如下:(从下面的链接复制)
Beanshell handles '==' like java and not e.g. like JavaScript. That means you've got to use "equals" to compare instances. bsh % "abc" == "abc"; => true bsh % "abc" == new String("abc"); => false bsh % "abc".equals("abc"); => true bsh % "abc".equals(new String("abc")); => true
此处提供更多信息:https://code.google.com/p/beanshell2/issues/detail?id=86
所以你必须使用&#34; .equal()&#34;,或编译你自己的bsh版本,就像我做的那样。 (阅读上面的完整问题)