我必须将大量代码从 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兼容性列表中提到。