コンパイル時の織り込みのみを使用して、多数の 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
でしょうか? または、ミックスインを強制する方法はありますか?