2016-12-05 11 views
0

私が知っていることは、次のとおりです。Javaでアノテーションを理解する方法と、Javaでアノテーションを実装する方法は?

  • 注釈は5
  • 注釈は注釈がRUNTIME、CLASS、SOURCE(Iドン」で働くことができる方法、クラス、およびプロパティ
  • に使用できるJavaで追加されました
  • RUNTIMEの保持を持つ注釈は、Javaプログラムの実行中に実装することができます。

そして、私が持っている注釈を実装するには、機能は以下:

  • 確保クラスのみ
  • 確実な方法は、唯一のクラスのメソッドにアクセスすることを許可されたインスタンスを作成するために許可されて
  • と同じですが、よりダイナミックな感じですが、よりダイナミックな感じです。

    @MyAnnotation(allowMethods = {xxx.doSomething})
    公共ボイドのgetValue(){}

    GetValuesメソッドは、唯一のインスタンス自己とxxx.doSomethingにアクセスすることができる()メソッド

私は何をして次に学ぶべきですか?

どこでこれらについて知ることができますか?

+0

実装したい2つの機能を完全には理解していませんが、アクセス修飾子( 'private''''''''''''''''''''''')で多くのことができます。 – Thilo

+0

@Thilo私は正しくOPを理解して、それはアクセス修飾子の反対のように聞こえる。 "メソッドがクラス内のメソッドにアクセスすることのみ許可されていることを保証する"メソッドのように聞こえるのは、同じクラス(== "クラス外"の依存関係)のメソッドを呼び出すことだけです。フリーズキング私は間違って理解してください私を修正してください。 – Fildor

+0

@Fildor私は質問の説明を更新しました。理解できますか?そうでない場合は、私にお願いします –

答えて

1

あなたは何かを誤解しているかもしれないと思います。注釈は記述的要素であり、プログラムの一部ではありません。あなたはあなたが望む数の注釈を書くことができます。あなたのコードを使っている人はそれを無視することができます。

言い換えれば、ポリシーを実行するアノテーションは、コンパイル時または実行時に実際に実装できますが、あなたに役立つ外部のメカニズムが必要です。私は3考えることができます:

  1. Annotation processingあなたは、コードを生成することによって、またはコンパイラエラーを省略することにより、コンパイラやプロセスの注釈と対話することができます。残念ながら、私はインスタンス化からあなたの注釈付きタイプを保護したいので、あなたのケースではうまくいかないと思います。それは、コールサイトが実際に注釈を持たないことを意味します。アノテーション処理は、アノテーションを持つ実際のコード部分にアクセスするだけで、アノテーションを参照するコード部分にはアクセスできません。
  2. AspectJを使用すると、静的ポイントカットに基づいてポリシー施行の側面を記述し、コンパイラエラーを省略することができます。ここで問題となるのは、静的なポイントカットは非常に限られたセマンティクスを持っているため、クラスのインスタンス化を禁止したり、特定のパッケージからクラスインスタンス化を1に制限することはできません。
  3. 3番目の方法、あなたはSpringやGuiceのようなコンテナを使い、クラスをシングルトンとして設定するだけです。コンテナからクラスを取得するだけで、2番目のインスタンスは決して作成されません。

最後に、クラスのインスタンス化の数を制限する場合は、いつも古典Singleton pattern approachを使用できます。

関連する問題