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
そのため、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 の変更を強制し (rerun タイプによるメソッドのオーバーロードは不可能です)、そのような setter-wrapper を使用してソース コードを肥大化させます。より良い解決策を提案できますか?
PS奇妙なのは、 java7互換性リストに記載されていないことです。