【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に読み込まれよう指定する。
java.lang.annotation.RetentionPolicy より RUNTIME を選択する。
/** * 実行時の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クラスであるかを検証」する処理が必要となる。
// 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である場合の処理 }