マーカーインタフェース
そのクラスを処理するべきかインタフェースで判断する。インタフェースは何も持たない
instansof演算子を使用しマーカーインタフェースを使用しているクラスか判定する手法
プロセッサ
マーカーインタフェースを使用するクラスを処理するクラスのこと
アノテーション
マーカーインタフェースを簡単に表現するためのもの
ある処理の対象になるものを示す
特徴
プロセッサに値を渡すことができる
フィールド、メソッド、コンストラクタの細かい単位で指定できる
独自定義方法
public @interface test{}
コンパイル後、java.lang.annotation.Annotationインタフェースを継承する記述になる
使用方法
@test
public class Item{}
コンパイルされるとインタフェースが定義されるわけではなく、アノテーションを持っているという情報が保存される
注釈パラメーター
@ interface内に設定するメソッドに付与する値のこと
@アノテーション名(注釈パラメーター=値...)
public @interface test{
String name();
int prise();
}
@test(name = "test",prise = 100)
public class Item{
String name;
int prise;
}
メソッド名をString型のvalueのみにすると@アノテーション名(値)で記述可能
デフォルト値の設定
public @interface test{
String name() default "default";
}
@DefaultValues
public class Item{
}
メタ・アノテーション
リフレクション
インスタンスが持っているメソッドやフィールドの種類を調べて、インスタンスを操作できる
java.lang.reflect
setAccessible()
フィールドのアクセス情報(アクセス修飾子のアクセス可不可の真偽値)を変更する
java.lang.class
Class<T> 変数名 = クラスリテラル
クラスがどのように定義しているかの情報を扱う
getAnnotation(アノテーションクラス)
クラスが持つアノテーション情報の取得
getDeclareFileds()
フィールドの定義情報を取得する
クラスリテラル
クラス名.classで表せる情報
RetentionPolicy
@ Retentionを下記の三つから選び@ interfaceクラスの上に使用する
アノテーションの保持期間、デフォルトでCLASSが設定される
破棄順
早 SOURCE⇒CLASS⇒RUNTIME 遅
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
説明 | |
---|---|
RUNTIME | 実行時まで保持する、実行時に何らかの処理をするプロセッサを作る時によく使われる |
CLASS | 実行時に破棄する |
SOURCE | コンパイル時に破棄する |
@ Target
そのアノテーションが何を対象としているか
@Target(ElementType.METHOD)
public @interface MyAnnotation {
}
説明 | |
---|---|
ANNOTATION | アノテーション宣言 |
CONSTRUCTOR | コンストラクタ宣言 |
FIELD | フィールド宣言 |
LOCAL_VARIABLE | ローカル変数宣言 |
METHOD | メソッド宣言 |
MODULE | モジュール宣言 |
PACKAGE | パッケージ宣言 |
PARAMETER | メソッドの引数宣言 |
TYPE | クラス、インタフェース、Enum宣言 |
TYPE_PARAMETER | 型パラメータ宣言 |
TYPE_USE | 型の使用 |
@ Deprecated
バージョン変更などによって使用できなくなる可能性があるものに付与する、非推奨であることを明示しコンパイラに警告を出させる
forRemoval = true
強く抑制する
@ SuppressWarnings
コンパイラの警告抑制
unchecked
警告抑制
deprecation
@Deprecatedの警告抑制
removal
@Deprecatedの強く抑制された警告を抑制
@ Functionalinterface
関数型インタフェースであることを示す