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

そのため、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互換性リストに記載されていないことです。

4

0 に答える 0