元柔道整復師エンジニアBlog

- 元柔道整復師エンジニアBlog -

『 エンジニアをリングする。』

【Java】独自マーカーアノテーションを活用する

目的

利用方法

1. 独自マーカーアノテーションを作成する

参考記事:ちょっと特殊なJavaのアノテーション

アノテーションの対象を指定する:Target
  • class・interface と method を対象とする。
    java.lang.annotation.ElementType より TYPE、METHOD を選択する。
  • ElementType を複数選択する場合は、弧{}を使用しカンマ,で区切る。
/**
 * class・interfaceとmethodに付与可能とするアノテーション
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@interface SampleAnnotation {

}
アノテーションの読み込みタイミングを指定する:Retention
/**
 * 実行時のVMの読み込みを表すアノテーション
 */
@Retention(RetentionPolicy.RUNTIME)
@interface SampleAnnotation {
    
}

2. アノテーション付与の有無による条件を加える

利用するマーカーアノテーション (1.で作成したアノテーション)

【利用例】 本アノテーション@IgnoreSessionが付与されたclass・interfaceまたはmethodは、 セッションを扱う処理ではない ことを表すマーカー用のアノテーションとする。

/**
 * セッションを扱わない処理であることを表すアノテーション
 * セッションを扱わない処理に付与
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreSession {

}
判定処理

アノテーション@IgnoreSessionが付与されたかの有無を判定する処理を記述する。

class・interfaceの検証

bean : class・interfaceの実体を表す

1. 通常の場合
// class・interfaceに対する検証
if (targetClass.isAnnotationPresent(IgnoreSession.class)
    
    // セッションを扱わないclass・interfaceである場合の処理
}
2. spring等のfw使用の場合

springAOPの処理において、検証対象なるbeanの実体がProxyクラスとなる場合があるため、 ②「class・interfaceに対する検証」の前に①「beanに対してProxyクラスであるかを検証」する処理が必要となる。

参考記事:SpringAOPが適用されたbeanを使ったメタプログラミングでハマった件

// class・interfaceを検証する
// ①beanに対してProxyクラスであるかを検証
Class<?> targetClass = null;
if (AopUtils.isAopProxy(bean)) {
    targetClass = AopUtils.getTargetClass(bean);
} else {
    targetClass = bean.getClass();
}
    
// ②class・interfaceに対する検証
if (targetClass.isAnnotationPresent(IgnoreSession.class)

    // セッションを扱わないclass・interfaceである場合の処理
}
methodの検証

method : methodの実体を表す

// methodに対する検証
if (method.isAnnotationPresent(IgnoreSession.class)) {

    // セッションを扱わないmethodである場合の処理
}

参考まとめ