web-dev-qa-db-ja.com

Javaアノテーションはアノテーション宣言内のメソッドを実行します(Androidでの使用)

私は注釈用語にかなり慣れていません。私はいくつかの情報源を読み、私の質問に答えなかったという結論に達しました。おそらく私は間違った検索を使用してグーグルで検索しました。多分私は見落としているか、多分私はただ無知です。

とにかくここに取引があります。

「役割の検証」が必要なアプリケーションの作成で忙しいです。

これを行うには、注釈を使用します。

したがって、次のようなものがあります。

@interface Validate (){

}

私が達成しようとしているのは、次のようなことです。

public @interface Validate() {
   public Validate() {
      //Do validation stuff
     return true/false
   }
}

したがって、基本的にはアノテーション内でメソッドを定義したいと思います。電話できるようになりたい

@Validate
public void methodThatRequiresAdminRole() {
  doStuff();
}

管理者のみがこのメソッドを入力できる必要があります。そうしないと、エラーが生成されます。

したがって、@ validateがtrueを返す場合は、メソッドを実行する必要があります

よくわからない場合は申し訳ありません。何が欲しいのかをきちんと尋ねる方法がよくわかりません。ですから、例が物語を物語っていることを願っています。

ヒントを読み、おそらくすぐに答えを読むことを望んでいます。ありがとう。

**編集**

コードはAndroidアプリケーションで使用する必要があるという事実を強調する必要があります。したがって、Android用ではない奇妙なフレームワークを使用しないことを好みます。次のようなカスタムライブラリを追加しても問題ありません。アプリケーションフレームワークのない機能。

14
Joey Roosing

注釈はメタデータです。あなたが書く必要があるのは注釈プロセッサです。注釈自体は検証ロジックを実行できません。注釈プロセッサは注釈を調べてから、検証を行い、アプリケーションフローを制御します。このSOの答えには良い説明があります Javaの注釈はこれに役立ちますか?

また、注釈情報が実行時まで保持されるように、@ Retention(RetentionPolicy.RUNTIME)で注釈に注釈を付ける必要があります。

@Retention(RetentionPolicy.RUNTIME) 
public @interface Validate() {
}
20
Narendra Yadala

これはかなりトピックから外れている可能性があることに注意してください。 spring AOP withを使用すると、アノテーションの処理はかなり簡単です。

アスペクトを作成します。

@Aspect
public class RoleCheckAspect {
  @Before("@annotation(your.package.Validate)")
  public void doAccessCheck() throws Exception {
    // Do validation stuff
    if (!valid)
      throw new IllegalAccessException("foo");
    }
  }
}

アスペクトを設定します。

META-INF /aop.xml内

<!DOCTYPE aspectj PUBLIC
  "-//AspectJ//DTD//EN" "http://www.Eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
  <weaver>
    <!-- only weave classes in our application-specific packages -->
    <include within="your.package..*" />
  </weaver>
  <aspects>
    <!-- weave in just this aspect -->
    <aspect name="com.bac.bsl.nonproc.TestAspect" />
  </aspects>
</aspectj>

セットアップ ロード時間織り

春の文脈では:

<context:load-time-weaver/> 

スプリングエージェントがアプリで起動していることを確認します。

Java -javaagent:/path/to/spring-agent.jar -classpath $CP your.package.MyApp
2
beny23

アノテーションだけではこれを達成できないと思います。これらは、処理ロジックではなく、コード要素に関するメタ情報を提供することを目的としています。アノテーション付きメソッドの呼び出しに制限を実際に実装するには、メソッドの内部または外部で手動でアクセスをチェックするか、 http://www.Eclipse.org/aspectj/ のようなものを使用してそのようなチェックを挿入する必要があります。 ==

0
Gandalf