我必须将大量代码从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中没有提到它。