检查void和null的跨语言Java/Beanshell方法
在BeanShell中,变量可以是检查void和null的跨语言Java/Beanshell方法,java,beanshell,Java,Beanshell,在BeanShell中,变量可以是null或void。是否有一种方法可以使用在BeanShell和Java中都有效(未修改,即复制/粘贴)的代码来测试两者(或至少void)?类似于:SomeUtilityClass.isNullOrVoid(…) 我使用复杂的BeanShell脚本,能够将Java IDE中的代码复制/粘贴到脚本中对我的工作效率和代码质量有很大帮助(是的,这意味着我没有使用BSH的脚本功能)。唯一的问题是测试void,这迫使我在之后手动调整每个脚本 无效的问题: 检查null不
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)在这个脚本中,x是无效的。Java是强类型的,并且该代码不会编译(显然,假设所有的类/方法代码都已准备就绪)。这意味着,如果您将纯Java代码粘贴到BeanShell中,那么您永远不会遇到对void的需求
但是如果您坚持,您可以尝试使用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;
}