检查void和null的跨语言Java/Beanshell方法

检查void和null的跨语言Java/Beanshell方法,java,beanshell,Java,Beanshell,在BeanShell中,变量可以是null或void。是否有一种方法可以使用在BeanShell和Java中都有效(未修改,即复制/粘贴)的代码来测试两者(或至少void)?类似于:SomeUtilityClass.isNullOrVoid(…) 我使用复杂的BeanShell脚本,能够将Java IDE中的代码复制/粘贴到脚本中对我的工作效率和代码质量有很大帮助(是的,这意味着我没有使用BSH的脚本功能)。唯一的问题是测试void,这迫使我在之后手动调整每个脚本 无效的问题: 检查null不

在BeanShell中,变量可以是
null
void
。是否有一种方法可以使用在BeanShell和Java中都有效(未修改,即复制/粘贴)的代码来测试两者(或至少
void
)?类似于:
SomeUtilityClass.isNullOrVoid(…)

我使用复杂的BeanShell脚本,能够将Java IDE中的代码复制/粘贴到脚本中对我的工作效率和代码质量有很大帮助(是的,这意味着我没有使用BSH的脚本功能)。唯一的问题是测试
void
,这迫使我在之后手动调整每个脚本

无效的问题

  • 检查
    null
    不会捕获
    void
stringfoo;System.out.println(“is null:”+(foo==null))

打印
为null:false
,这会导致类似
的代码,如果(var!=void&&var!=null){…}
在Java中不起作用(并且不可能将
void
声明为常量,因为它是保留字)

  • bsh.NameSpace
    没有检查
    void
    getVariable(…)
    返回
    void
stringfoo;System.out.println(“变量:”+this.namespace.getVariable(“foo”))

打印
变量:void
,这样我们就回到了原点。即使有一个方法可以做到这一点(假设我将使用适当的方法编写一个自定义命名空间子类,
setNameSpace(…)
it),也需要一种跨环境调用它的方法(请参见下一点)

  • 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中工作,因为它需要使用方法变量而不是实例字段。另一种(笨重的)版本:

如果第三个参数是未定义的参数,则可以从Java工作,但不能从BeanShell工作

  • 声明自定义BSH命令也不是一个选项
即使在脚本本身中定义了helper方法,它也会以完全相同的方式分解,出现未定义的参数异常:

public boolean isNullOrVoid(Object var) {
    return var == null || var == void;
}
String foo;
System.out.println(isNullOrVoid(foo));

我不能发表评论,因为我在这里相对较新。我对此表示歉意,因为我更愿意发表以下评论

我确实怀疑你试图做什么的前提。BeanShell是弱类型的,这就是为什么你需要void。我可以说
print(x)
但是如果您坚持,您可以尝试使用eval()命令。共享方法如下所示:

boolean isNullOrVoid(Object o) {
 return eval("o == void") || o == null;
}
这对于BeanShell来说很好,但是现在您必须在Java代码中实现eval()命令,但是因为(如前所述)没有void的概念,所以它应该总是返回false


PS void check应该在null check之前出现。

您使用的Beanshell的确切版本是什么,因为我已经尝试了您的代码示例,但没有看到任何返回“void”的内容。见鬼,“void”在Java中甚至不是一种类型。如果它返回“Void”,那么它在某种程度上是有意义的,但事实也并非如此。
boolean isNullOrVoid(Object o) {
 return eval("o == void") || o == null;
}