java.lang.reflect.Field getType()的结果不能与使用equals()的类型进行比较



我很可能在这个微不足道的用例中忽略了一些东西。我的代码迭代类中的带注释的字段,对于每个字段,我想运行一些依赖于类型的代码。最简单的方法就是设置一个值:

field.setAccessible(true);
final Class<?> type = field.getType();
if (type.equals(Boolean.class)) {
    field.set(this, Boolean.parseBoolean(property));
} else if (type.equals(Integer.class)) {
    field.set(this, Integer.parseInt(property));
} else if (type.equals(String.class)) {
    field.set(this, property);
} else {
    LOGGER.warn("Cannot parse property -{}{}. Unknown type defined.", option.getOpt(),
            field.getName());
}

但是这个检查:

if (type.equals(Boolean.class))

不能像预期的那样工作,例如对于定义为private boolean isVerbose;的字段。在检查了type之后,我得到了属性name仅仅是"boolean",其中Boolean.class属性name"java.lang.Boolean"填充。这些对象是不同的

这个场景的正确实现是什么?

看看这篇文章:检查原语字段的类型

基本上你需要单独检查基本类型(Boolean.TYPE, Long.TYPE等)

if (field.getType().equals(Boolean.TYPE) {
  // do something if field is boolean
}

我相信您在java原语和装箱方面遇到了麻烦。boolean是一个类,其中"boolean"仅表示基本类型。

是否声明是不同的:

private boolean myBool; // this a java primitive
private Boolean myOtherBool; // this is an object

Java根据需要自动在这些类型之间进行转换,但是当您自己检查类型时,您必须注意这一点。

同样适用于:——整数——长——短字节的

我希望我没有忘记什么。

在Java中,booleanBoolean是两种不同的类型:boolean是原始数据类型,而Booleanjava.lang.Boolean中的一个类。在这个例子中,在你的类中,你使用的是private boolean isVerbose,而不是java.lang.Boolean类型。因此,您必须将其更改为private Boolean isVerbose。希望这对你有所帮助!!!!!!

相关内容

  • 没有找到相关文章

最新更新