PropertyDescriptor与返回值的setter

时间:2012-09-04 14:22:55

标签: java reflection javabeans java-7 introspection

我必须将大量代码从java6移植到java7。 Java6对setter没有问题,返回值。所以这个示例代码:

public class Main {
public static class MyDummy {
    private String payload;

    public String getPayload() {
        return payload;
    }

    public boolean setPayload(String payload) {
        this.payload = payload;
        return true;
    }
}
public static void main(String[] args) {
    System.out.println("JAVA: " + System.getProperty("java.version") + " (" + System.getProperty("java.vm.name") + ")");
    MyDummy d = new MyDummy();
    d.setPayload("init");
    System.out.println("Value before: " + d.getPayload());

    try {
        PropertyDescriptor pd = new PropertyDescriptor("payload", MyDummy.class);
        pd.getWriteMethod().invoke(d, "hello introspection");
    } catch (Exception e) {
        System.out.println("Exception: " + e);
    }
    System.out.println("Value after: " + d.getPayload());

}
}

结果等待java 6的输出:

JAVA: 1.6.0_24 (OpenJDK 64-Bit Server VM)
Value before: init
Value after: hello introspection

不幸的是(对我而言)java 7的输出是:

JAVA: 1.7.0_06 (Java HotSpot(TM) 64-Bit Server VM)
Value before: init
Exception: java.beans.IntrospectionException: Method not found: setPayload
Value after: init

所以内省对于setter来说不再起作用了,它们会返回任何空洞。我的问题是我该怎么办?第一个想法是将setter包装在void-setter中。像这样:

public void setPayload(String payload) {
    setPayloadImpl(payload); // ignoring return value
}
public boolean setPayloadImpl(String payload) {
    this.payload = payload;
    return true;
}

但是这个解决方案强制改变setter-name(通过retrun类型的重载方法是不可能的)并且使用这样的setter-wrappers来膨胀源代码。你能建议一个更好的解决方案吗?

P.S。奇怪的是java7 compatibility list中没有提到它。

0 个答案:

没有答案