5

メソッドが複数回呼び出された場合に RuntimeException をスローするようにメソッドをマークできるようにする必要があります。

私はいくつかの単一の代入セマンティクスを強制しようとしていますが、クラスへのパラメーターの数が多すぎて単一のコンストラクターに入れることができず、これらのクラスJAXBも認識できるようにする必要があるため、オブジェクトは変更可能である必要がありますが、単一の割り当てセマンティクスを強制します。

Aspects でこれを実行できると確信していますが、代わりに独自の Annotations プロセッサを使用できるようにしたいと考えています。

Python の Decorators でこれを行う方法を知っています。

コンパイル時だけでなく、実行時にアノテーション付きメソッドへの呼び出しをインターセプトできるアノテーション プロセッサを作成するにはどうすればよいですか?

メソッド呼び出しをインターセプトする動的プロキシを使用して、何かに取り組んでいると思います。それらを Annotation プロセッサと統合する方法を理解する必要があるだけです。

動的プロキシでは、インターフェイスを使用する必要があります。これは面倒です。依存関係を追加することを犠牲にして、 CGLib MethodInterceptorが動作しています。

4

5 に答える 5

3

いいえ、すぐに使えるものはありません。そして、AspectJ はそれをより一般的な方法で機能させる唯一の方法のようです。JB Nizet が指摘したように、注釈にはそれを解析するためのパーサーが必要です。

ただし、より優れたシンプルなソリューションである Builder パターンをお勧めします。それはどのように見えますか:

  • FooBuilder変更可能で、フィールドごとにセッターとゲッターを持つ(静的内部クラスの場合もあります)があります
  • FooBuilderのインスタンスを返すbuild()メソッドがありますFoo
  • Fooのみを取るコンストラクタがあり、FooBuilderそこに各フィールドを割り当てます。

その方法:

  • Foo不変であり、それが最終目標です
  • 使いやすいです。必要なフィールドのみを設定します。何かのようなもの:

    Foo foo = new Foo.FooBuilder().setBar(..).setBaz(..).build();
    

そうすれば、ビルダーは JAXB 対応になります。例えば:

FooBuilder builder = (FooBuilder) unmarshaller.unmarshal(stream);
Foo foo = builder.build();

JAXB オブジェクトは可変である必要があり、要件は不変オブジェクトです。したがって、ビルダーはそれを橋渡しするのに便利です。

于 2011-10-28T10:14:33.933 に答える
2

この質問は、質問Applying CGLib Proxy from a Annotation Processorと似ています。

アノテーション プロセッサで元のソース コードの動作を変更できるようにしたい場合は、http://projectlombok.org/がこれをどのように実現しているかをご覧ください。IMO の唯一の欠点は、lombok が com.sun.* クラスに依存していることです。

私はこの種のものを自分で必要としているので、注釈プロセッサを使用して、これを達成するためのより良い方法を誰かが知っているのではないかと思います。

于 2012-04-25T06:45:57.603 に答える
1

を使用して、フィールド (インスタンス変数) アクセスを使用するように JAXB を構成できます@XmlAccessorType(XmlAccessType.FIELD)。これにより、set メソッドで必要なことを行うことができます。

JAXB のXmlAdapterメカニズムを使用して、不変オブジェクトをサポートすることもできます。

于 2011-10-28T10:38:34.107 に答える
0

注釈を使用する代わりに、使用できます。

assert count++ != 0;

メソッドごとに 1 つのカウンターが必要です。

于 2011-10-28T10:17:56.433 に答える