16

のJavaでカスタムアノテーションを作成したいDirtyChecking。このアノテーションを使用して2つの文字列値を比較したいのと同じように、比較した後、boolean値が返されます。

例:@DirtyCheck("newValue","oldValue")プロパティを上書きします。

インターフェイスを作成したとします。

 public @interface DirtyCheck {
    String newValue();
    String oldValue();
 }

私の質問は

  1. 2つの文字列値を比較するためのメソッドを作成するクラスを作成する場所はどこですか?つまり、このアノテーションは、このメソッドを呼び出さなければならないことをどのように通知するのでしょうか。
  2. このメソッドの戻り値を取得するにはどうすればよいですか?
4

3 に答える 3

21

最初に、アノテーションがクラス、フィールド、またはメソッドのいずれであるかをマークする必要があります。method: 用であるとしましょう。したがって、これを注釈定義に記述します。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DirtyCheck {
    String newValue();
    String oldValue();
}

次に、DirtyCheckerリフレクションを使用してメソッドに注釈があるかどうかを確認し、たとえばoldValuenewValueが等しいかどうかなどのジョブを実行するクラスを作成する必要があります。

final class DirtyChecker {

    public boolean process(Object instance) {
        Class<?> clazz = instance.getClass();
        for (Method m : clazz.getDeclaredMethods()) {
            if (m.isAnnotationPresent(DirtyCheck.class)) {
                DirtyCheck annotation = m.getAnnotation(DirtyCheck.class);
                String newVal = annotation.newValue();
                String oldVal = annotation.oldValue();
                return newVal.equals(oldVal);
            }
        }
        return false;
    }
}

乾杯、ミハル

于 2012-09-04T09:11:12.650 に答える
2

2 番目の質問に答えるには: 注釈は値を返すことができません。注釈を処理するクラスは、オブジェクトに対して何かを行うことができます。これは、たとえばロギングによく使用されます。この場合に例外をスローするか、何らかの種類のDirtyHandler.

あなたの最初の質問について:あなたは本当にこれを自分で見つけるのにいくらかの努力を費やすことができました. ここには、stackoverflow と Web に関する十分な情報があります。

于 2012-09-04T09:12:09.063 に答える