このブログは、次の問題に分かれて説明すること
- ノート関連知識
- 注釈ベースの実行時間解析の記述の例
コンパイル時についてのコメントについては、時間が例を挙げて、次のブログになり、今説明し、私はそれらを学んでいます
ノート関連知識
言及したノートは、ほとんどの人はSupressWarnings @、Deprected @、私たちのプログラム@オーバーライドで見るというように、これらはノートがあり、デフォルトではないはずですが、システム自体は良いパッケージであり、我々は通常より少なく行きますどのように達成するかの深い理解?
1)どのようなものがあり、アノテーション(注釈):
アノテーション(注釈)は、Javaは、任意の情報とメタプログラム要素の任意のメタデータ(メタデータ)の方法と手段との関連付けを提供します。Annotion(注)インターフェイスで、プログラムは反射を介して指定されたターゲットAnnotionプログラム要素を取得することができ、その後、オブジェクトの内部Annotionによってメタデータアノテーションを取得します。
2)注釈カテゴリ:
注釈パラメータの数によると、我々は3つのカテゴリに分類注釈を付けることができます。
- マーク・ノート:注釈はマーカーアノテーションを呼ばれる定義された型のメンバーではありません。私たちに情報を提供する唯一の彼らの有無を使用して、このタイプの注釈。例えば、注釈システムバック@Override。
- 単一値のノート
- 全コメント
方法および使用を使用してノートによると、我々は3つのカテゴリに分類注釈ことができます。
- JDK組み込みシステムの注意事項
- 元のメモ
- カスタム注釈
3)メタアノテーション:
メタアノテーションの役割は、他の注釈ノートに責任があります。Java5.0規格は、指定された注釈の他の種類を提供するために使用される4つのメタ注釈型を定義します。Java5.0はメタアノテーションを定義しました。
- @ターゲット、
- @保持、
- @Documented、
- @継承されました
4)メタ注釈解析命令
@Documentedは、Javadocドキュメントに保存されているかどうか
@Retention保持時間、オプションの値
SOURCE(ソース)、クラス(コンパイル時)、ランタイム(実行中)は、デフォルトは、例えば、上書き、SuppressWarningsのクラス、SOURCEほとんどマーク注釈、主に検証するために使用されるような注釈であります
そのような修飾され得るタイプ、メソッド、コンストラクタ、フィールド、パラメータ他の修飾として使用することができる@targetプログラム要素は、マークされていないすべてのことを示しています
ANONOTATION_TYPE(注釈型の宣言)、
(パケット)のパッケージ
型(クラス、および列挙を含むインタフェース、注釈タイプ)
法(方法)
コンストラクター(コンストラクタ)
FIFLD(メンバ変数)
のparamater(パラメータ)
LOCAL_VARIABLE(ローカル変数)@Inheritedを継承できるかどうかは、デフォルトはfalseです
5)メタデータ(メタデータ)は何ですか。
ワードメタデータから翻訳されたメタデータは、手段「データに関するデータ」です。
ファンクション例えば、多くのメタデータがあります:あなたは自動的にJavadocコメントを使用したドキュメントを生成してもよいです。これは、メタデータ機能です。全体的に、メタデータではなく、既存の構成ファイルの文書、依存関係のトラッキングコード、コンパイル時のチェック形式を作成するために使用することができます。あなたは、メタデータの役割を分類したい場合は、明確な定義はありませんが、我々はそれに役割を再生することができ、それは大きく3つのカテゴリに分けることができます。
- 文書化:文書識別コードによって生成されたメタデータ
- コード分析:識別コードメタデータのコードにより解析
- チェックをコンパイルします。メタデータの識別コードをコンパイラは、基本的なコンパイラのチェックを達成できるように、
その他の知識が導入されていない、個人的に私は一度にあまりにも多くが消化しにくい概念を導入することを感じます。それを使用する例で私たちを一緒にしましょう。
ここでは、我々はコンパイル時のカスタムアノテーションベースの例を書くことができる方法を見て
カスタム注釈は、大きく以下の3つのステップに分けることができます。
- コメントをカスタマイズします
- 他のクラスでは、私たちのコメントを使用します
- 実行時に、私たちの分析ノート
動作フローチャートの解析
1)まず、我々は、我々は、カスタム注釈を定義する方法を見て
彼らはサポートしてこれらのクラスの種類とはjava.lang.annotationのパッケージに記載されています。
/*
* 定义注解 MethodInfo
* 为方便测试:注解目标为类 方法,属性及构造方法
* 注解中含有三个元素 id ,name和 gid;
* id 元素 有默认值 0
*/
@Documented
@Target({ElementType.TYPE,ElementType.METHOD,
ElementType.FIELD,ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface MethodInfo {
String name() default "xujunTest";
int id() default 0;
Class<Long> gid();
}
分析の説明
- 定義による。@interface、注釈名は、カスタム注釈の名前である(1)、ここではノートMETHODINFOと呼ばれます
(2)注釈カテゴリと呼ばれる注釈の設定パラメータの名前を、と:
この方法は、その方法ではありません。すべて、何の修飾子がパラメータ、唯一の実際のパブリック&abstract修飾子を持っていない、デフォルトはpublic、許可例外
Bメソッドの戻り値がプリミティブ型、文字列、クラス、アノテーション、列挙又はそれらの一次元アレイのいずれかでなければなりません
C。唯一のデフォルトプロパティ場合は、直接値()関数を使用することができます。プロパティは、マーク注釈ザ注釈として表現されていません(3)デフォルト値は以下のようなデフォルトを添加することができることを示し
String name() default "xujunTest";
2)その後、我々は我々のカスタム注釈を使用することができる方法を見て
/**
* 这个类专门用来测试注解使用
* @author xujun
*/
//类成员注解
@MethodInfo (name="type",gid=Long.class)
public class UserAnnotation {
//类成员注解
@TestA(name="param",id=1,gid=Long.class)
private Integer age;
//构造方法注解
@TestA (name="construct",id=2,gid=Long.class)
public UserAnnotation(){
}
//类方法注解
@TestA(name="public method",id=3,gid=Long.class)
public void a(){
Map<String,String> m = new HashMap<String,String>(0);
}
//类方法注解
@TestA(name="protected method",id=4,gid=Long.class)
protected void b(){
Map<String,String> m = new HashMap<String,String>(0);
}
//类方法注解
@TestA(name="private method",id=5,gid=Long.class)
private void c(){
Map<String,String> m = new HashMap<String,String>(0);
}
public void b(Integer a){
}
}
3)最後に、我々は、実行時に私たちの注釈の注釈を解決する方法を一緒に見て
注釈解決ランタイム
(1)注釈は、注釈@Retentionランタイムをランタイムに意味し、手動で解析し、以下のAPIを呼び出すために使用することができます
method.getAnnotation(AnnotationName.class);
method.getAnnotations();
method.isAnnotationPresent(AnnotationName.class);
他のそのような@Targetフィールド、類似したクラスメソッド
- getAnnotation(AnnotationName.class)は、ターゲットが複数の注釈のように変形することができ、情報は、ターゲットの注釈を取得したことを示し
/*
* 根据注解类型返回方法的指定类型注解
*/
MethodInfo annotation = (MethodInfo) constructor
.getAnnotation(MethodInfo.class);
- getAnnotations()すべてのターゲットは、注釈を取得したことを示し
Annotation[] annotations = clazz.getAnnotations();
for (Annotation annotation : annotations) {
MethodInfo methodInfo = (MethodInfo) annotation
}
- isAnnotationPresent(AnnotationName.class)は、ターゲットが修正注釈であるかどうかを示します
/*
* 判断构造方法中是否有指定注解类型的注解
*/
boolean hasAnnotation = constructor
.isAnnotationPresent(MethodInfo.class);
if (hasAnnotation) {
/*
* 根据注解类型返回方法的指定类型注解
*/
MethodInfo annotation = (MethodInfo) constructor
.getAnnotation(MethodInfo.class);
}
テストコード
public class ParseAnnotation {
static String className="com.xujun.animation.test.UserAnnotation";
/**
* 简单打印出UserAnnotation 类中所使用到的类注解 该方法只打印了 Type 类型的注解
*
* @throws ClassNotFoundException
*/
public static void parseTypeAnnotation() throws ClassNotFoundException {
Class clazz = Class.forName(className);
Annotation[] annotations = clazz.getAnnotations();
for (Annotation annotation : annotations) {
MethodInfo testA = (MethodInfo) annotation;
System.out.println("id= \"" + testA.id() + "\"; name= \""
+ testA.name() + "\"; gid = " + testA.gid());
}
}
/**
* 简单打印出UserAnnotation 类中所使用到的方法注解 该方法只打印了 Method 类型的注解
*
* @throws ClassNotFoundException
*/
public static void parseMethodAnnotation() {
Method[] methods = UserAnnotation.class.getDeclaredMethods();
for (Method method : methods) {
/*
* 判断方法中是否有指定注解类型的注解
*/
boolean hasAnnotation = method.isAnnotationPresent(MethodInfo.class);
if (hasAnnotation) {
/*
* 根据注解类型返回方法的指定类型注解
*/
MethodInfo annotation = method.getAnnotation(MethodInfo.class);
System.out.println("method = " + method.getName() + " ; id = "
+ annotation.id() + " ; description = "
+ annotation.name() + "; gid= " + annotation.gid());
}
}
}
/**
* 简单打印出UserAnnotation 类中所使用到的方法注解 该方法只打印了 Method 类型的注解
*
* @throws ClassNotFoundException
*/
public static void parseConstructAnnotation() {
Constructor[] constructors = UserAnnotation.class.getConstructors();
for (Constructor constructor : constructors) {
/*
* 判断构造方法中是否有指定注解类型的注解
*/
boolean hasAnnotation = constructor
.isAnnotationPresent(MethodInfo.class);
if (hasAnnotation) {
/*
* 根据注解类型返回方法的指定类型注解
*/
MethodInfo annotation = (MethodInfo) constructor
.getAnnotation(MethodInfo.class);
System.out.println("constructor = " + constructor.getName()
+ " ; id = " + annotation.id() + " ; description = "
+ annotation.name() + "; gid= " + annotation.gid());
}
}
}
public static void main(String[] args) throws ClassNotFoundException {
parseTypeAnnotation();
parseMethodAnnotation();
parseConstructAnnotation();
}
}
上記のテスト手順を実行するには、次の出力を見ることができます
ID = "0"。名前=「タイプ」。GID =クラスjava.lang.Longの
メソッド= C。ID = 5。説明=民間の方法。GID =クラスがjava.lang.Longの
メソッド= B。ID = 4。説明=保護方法。GID =クラスがjava.lang.Longの
メソッド=。ID = 3。説明=公共の方法。GID =クラスjava.lang.Longの
コンストラクタ= com.xujun.animationdemo.UserAnnotation。ID = 2; 説明=コンストラクト。GID =クラスjava.lang.Longの
再現し、明記してください元のブログのアドレスを:
関連ブログの推奨
スイープは、私は公共のマイクロチャネル番号の注意歓迎押し流さstormjun94(徐コードワード)を、現在プログラマで、Androidの開発者だけでなく、知識を共有するために、だけでなく、技術的な人々が職場での個人的な要約、経験を含めて、育っ共有するために、面接の経験ように、あなたはあまり少し回り道を行くようにしたいです。