8

我将变量值设置为 null,但遇到问题:

public class BestObject {
    private Timestamp deliveryDate;
    public void setDeliveryDate(Timestamp deliveryDate) {
         this.deliveryDate = deliveryDate;
    }
}

BeanUtils.setProperty(new BestObject(), "deliveryDate", null); // usually the values are not hardcoded, they come from configuration etc

这是错误:

org.apache.commons.beanutils.ConversionException: No value specified
    at org.apache.commons.beanutils.converters.SqlTimestampConverter.convert(SqlTimestampConverter.java:148)
    at org.apache.commons.beanutils.ConvertUtils.convert(ConvertUtils.java:379)
    at org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:999)

基本上它试图将 java.sql.Timestamp 值设置为 null,但由于某种原因它不起作用。

另一方面,我正在使用反射包装器 BeanUtils(http://commons.apache.org/proper/commons-beanutils/),也许这可以通过普通反射实现?

4

4 回答 4

13

我设法用标准反射来做到这一点。

java.lang.reflect.Field prop = object.getClass().getDeclaredField("deliveryDate");
prop.setAccessible(true);
prop.set(object, null);
于 2013-10-09T06:37:10.593 回答
2

可以通过简单的技巧来完成

Method setter;
setter.invoke(obj, (Object)null);
于 2015-09-02T18:29:33.667 回答
1

BeanUtils 的错误跟踪器中发布了类似的投诉(和解决方法)。请参阅https://issues.apache.org/jira/browse/BEANUTILS-387

于 2013-10-08T13:41:02.077 回答
1
Book book = new Book();
Class<?> c = book.getClass();
Field chap = c.getDeclaredField("chapters");
chap.setLong(book, 12)
System.out.println(chap.getLong(book));

[Oracle 官方来源] https://docs.oracle.com/javase/tutorial/reflect/member/fieldValues.html

于 2018-11-16T07:08:03.193 回答