1

我必须将大量代码从 java6 移植到 java7。Java6 在设置器、返回值方面没有问题。所以这个示例代码:

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 来说,内省不再起作用,它返回的东西除了 void 之外的任何东西。我的问题是我该怎么办?第一个想法是将 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(不可能通过重新运行类型重载方法)并使用此类 setter-wrappers 使源代码膨胀。你能提出一个更好的解决方案吗?

PS奇怪,它没有在java7兼容性列表中提到。

4

0 回答 0