在 BeanShell 中变量可以是null
或void
。void
有没有办法使用在 BeanShell 和 Java 中都可以工作(未修改,即复制/粘贴)的代码来测试两者(或至少)?类似的东西:SomeUtilityClass.isNullOrVoid(...)
。
我使用复杂的 BeanShell 脚本,并且能够将代码从 Java IDE 复制/粘贴到脚本中,这对我的工作效率和代码质量有很大帮助(是的,这意味着我没有使用 BSH 的脚本功能)。唯一的问题是测试void
迫使我事后手动调整每个脚本。
问题void
:
- 检查
null
未捕获void
:
String foo; System.out.println("is null: "+ (foo == null));
prints is null: false
,这会导致类似if (var != void && var != null) { ... }
which 在 Java 中不起作用的代码(并且声明void
为常量是不可能的,因为它是保留字)
bsh.NameSpace
没有检查void
和getVariable(...)
返回的方法void
:
String foo; System.out.println("variable: "+ this.namespace.getVariable("foo"));
打印variable: void
,所以我们回到第一方。即使有一种方法可以做到这一点(假设我将使用适当的方法编写一个自定义 NameSpace 子类,并且setNameSpace(...)
它)也需要一种以跨环境方式调用它的方法(请参阅下一点)。
- 用 like 方法编写自定义帮助器类
isNull(Object bshNameSpace, String varName, Object var)
似乎是不可能的。
像这样的辅助方法:
public class Helper {
public static boolean isNullOrVoid(This bshThis, String name) throws Exception {
Primitive p = (Primitive) bshThis.getNameSpace().getVariable(name);
return p == Primitive.NULL || p == Primitive.VOID;
}
}
从 BeanShell 工作得很好,但没有办法(我知道)将它重新设计为在 Java 中工作(使用反射或其他方式),因为它需要使用方法变量而不是实例字段。另一种(笨重)版本:
public static boolean isNullOrVoid(Object bshThis, String name, Object var) throws Exception {
if (!(bshThis instanceof This)) {
return var == null;
}
Primitive p = (Primitive) ((This)bshThis).getNameSpace().getVariable(name);
return p == Primitive.NULL || p == Primitive.VOID;
}
如果第三个参数是Undefined argument ,则适用于 Java 但不适用于 BeanShell 。
- 声明自定义 BSH 命令也不是一种选择。
即使在脚本本身中定义了辅助方法,它也会以完全相同的方式爆炸,并带有未定义的参数异常:
public boolean isNullOrVoid(Object var) {
return var == null || var == void;
}
String foo;
System.out.println(isNullOrVoid(foo));