9

コンパイル時の織り込みのみを使用して、多数の DTO に対してデフォルトの toString() メソッドを織り込もうとしています。目標は、Jackson ライブラリを使用して JSON 表現を返すことです。

この記事の提案に従い、それを注釈スタイルのアスペクト構成に変え、最終的に次のコードになりました。

public @Aspect class JsonToStringAspect {
    private interface JsonToString {
        public String toString();
    }

    public static class JsonToStringImpl implements JsonToString {
        public String toString() {
            return SingletonJsonEncoder.toJsonString(this);
        }
    }

    @SuppressWarnings("unused")
    @DeclareParents(value = "com.mycompany.dto..*", defaultImpl = JsonToStringImpl.class)
    private JsonToString implementedInterface;
}

結果のクラスで実行javapすると、それらが JsonToString インターフェースを実装していることがわかりますが、toString() メソッドの兆候はどこにもありません。

メソッド名を Object.toString() と衝突しないもの (toString2() など) に変更すると、そのメソッドは本当に追加されます。

これを克服する方法の手がかりはありますか?package@Aroundの下の子クラスに対してのみ、 java.lang.Object.toString() の実行をインターセプトするポイントカットに関するアドバイスcom.mycompany.dtoでしょうか? または、ミックスインを強制する方法はありますか?

4

1 に答える 1

2

私はあなたのシナリオを試してみましたが、動作を再現できました.@DeclareMixin代わりにの組み合わせも試しましたが、それも機能し@DeclareParentませんでした. 私にとってうまくいったのは、このようにネイティブのaspectjを使用することです:

public aspect JsonToStringAspect {
    private interface JsonToString {}
    declare parents: com.mycompany.dto.* implements JsonToString;

    public String JsonToString.toString() {
        return "Overridden String through JsonToStringAspect";
    }
}

@AspectJこれは使用できない可能性があり、ネイティブの側面を介してのみ可能であると推測しています。

于 2013-01-11T22:17:25.440 に答える