2012-07-04 1 views
2

У меня есть этот простой класс Bean и попробуйте установить некоторые значения с помощью функции BeanUtils.setProperty. Кажется, что String работает отлично, но когда я пытаюсь установить логическое значение, это просто не работает. Я пробовал и определял поле как общедоступное, но все еще не работающее. Любая помощь? Почему это не работает?BeanUtils.setProperty не работает для булевых значений?

public class TestBean { 

protected Boolean someBoolean; 
protected String name; 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public boolean isSomeBoolean() { 
    if (someBoolean == null) { 
     return true; 
    } else { 
     return someBoolean; 
    } 
} 

public void setSomeBoolean(Boolean value) { 
    this.someBoolean = value; 
} 

public static void main(String[] args) { 
    TestBean o = new TestBean(); 
    Boolean b = new Boolean(false); 
    BeanUtils.setProperty(o, "someBoolean", b); 
    BeanUtils.setProperty(o, "name", "A name"); 
    System.out.println(((TestBean)o).isSomeBoolean()); 
    // Output = true WHY????? 
    System.out.println(((TestBean)o).getName()); 
    // Output = A name 

    BeanUtils.setProperty(o, "someBoolean", false); 
    BeanUtils.setProperty(o, "name", "Another name"); 

    System.out.println(((TestBean)o).isSomeBoolean()); 
    // Output = true WHY???? 
    System.out.println(((TestBean)o).getName()); 
    // Output = Another name   

} 

}

+0

Почему вы постоянно произнося 'O' в' TestBean' когда это он объявлен тип? –

+0

Извините, это просто что-то, что осталось от более сложного кода, где я не знаю точного класса объекта. Я создаю экземпляр следующим образом: Object o = class.newInstance(); – Ziggurat

ответ

3

Вы должны изменить его из

protected Boolean someBoolean; 

в

protected boolean someBoolean; 

Вы получите больше информации здесь.

Java Beans, BeanUtils, and the Boolean wrapper class

+0

Хорошо, это работает, но до сих пор не понимаю почему. Невозможно установить значение булева с помощью отражения? – Ziggurat

+2

Переименуйте свой метод 'isSomeBoolean' в' getSomeBoolean'. Эвристика отражения не покрывает комбинацию метода «is ...», основанного на ссылках. Альтернативой является написать собственный код отражения. Это не так сложно. –

+0

@MarkoTopolnik вы можете дать мне образец того, как написать свой собственный код отражения? Я попытался с полем bool = object.getClass(). GetDeclaredField ("someBoolean"); а затем bool.setBoolean, но с той же проблемой. – Ziggurat