ディレクトリ
A.注釈とは何ですか
私たちは、パターンのようなテストアノテーションは通常の開発プロセスである@、注釈は、パラメーター・マーカーの前に、クラス、コンストラクタ、メソッド、プロパティを配置し、SuppressWarnings @、など@オーバーライドとして、多くのコードを参照してください。
二つ。アノテーションの役割
クラス、メソッド...コメントを追加するには、このリンクがマークのみ行われ、コード自体は何の影響も与えないだろうに、とそれ以降のリンクを必要とする、他の方法は、ビジネス・ロジックの処理与えられたノートを必要としています。私たちは一緒に取得する方法を知って、私たちの間クリアする、他の人が戻って共有の場所にあるときにのみ、マイクロチャネルの上に配置され共有され、現時点では使用がない距離を行っているのと同じように。
3つのカテゴリに分類ノート:
2.1コンパイラはコメントを使用しています
SuppressWarningsがコメントすることをコンパイラで使用されている@このような@オーバーライドとして、それがコンパイルされた.classファイルに行かなくても、コンパイラ何かを伝えることです。
@Override:親クラスかどうかを確認する方法を書き換えるようにコンパイラに伝えます。
@SuppressWarnings:生成されたコードの警告セクションを無視するようにコンパイラに伝えます。
開発者にとっては、それがさらなる行動せずに直接使用されています
2.2 .classファイルノートへ
ツールで注釈付きのバイトコード.classファイルにいくつかの変更を加える必要があるとき、いくつかのクラスのロード、の.classファイルの注釈で表さ動的変更、ツールはいくつかの特別な機能を実現するために、設定され、1回の処理が完了すると、メモリ内に存在しない場合、フレームワークは、一般的に関与していない、開発者のために使用する、非常に低レベルのツールライブラリです。
2.3ランタイム読み取りノート
JVMに存在しており、ノートは、運転中に読み取ることができ、最も一般的に使用される注釈はAutoWired、@マッパーのMyBatisの、@TestのJUnitの、など、これらのノート@、@、このようなサービス、@コントローラ@春、として、リポジトリであります多くのツールは、カスタムフレームワークは、一般的な開発者はまた、コメントのこのタイプをカスタマイズすることができ、操作のノートの間に特別な役割を果たしています。
III。定義注釈
私たちは、コメントを定義するために使用@interface
/**
* 定义一个Table注解
*/
public @interface Table {
String value() default ""; }
/**
* 定义一个Colum注解
*/
public @interface Colum {
String value() default ""; String name() default ""; String dictType() default ""; }
これは単に、注釈の良い定義されます
私たちは、String型のコメント主な使用上で定義されたが、実際には、基本的なデータ型(ない梱包など)、列挙型ことができます。
ノートは、通常の状況下で、我々は、デフォルトのパラメータでデフォルトを設定する一方、最も一般的なパラメータは、値の名前べきである条約の何かを持っています。
しかし、これは、それを私たちの使用に満足することはありませんが、私はしたい@Table
クラスにのみコメント、@Colum
注釈は、プロパティでのみ使用され、どのように?そして、冒頭で述べた3つの音、開発者はノートの一般的な実行で使用されているが、我々はそれを定義することですか?
これらの質問に答えるために、我々は、の概念を導入する必要があり、「メタアノテーションを。」
3.1元のメモ
注釈を変更することができるJavaはメタアノテーションの数を定義している、私たちが直接使用することができ、メタ注釈の注釈です。
3.1.1 @Target
名前が示唆するように、目標オブジェクトパラメータを指定するためのアノテーションの使用は]のElementTypeあります[
public @interface Target {
/**
* Returns an array of the kinds of elements an annotation type
* can be applied to.
* @return an array of the kinds of elements an annotation type
* can be applied to
*/
ElementType[] value();
}
以下に定義されたプロパティのElementType列挙であり、TYPE_PARAMETER離れて、ターゲットを設定しない、TYPE_USE、他の部分は、構成に相当します。
public enum ElementType {
/** 通过ElementType.TYPE可以修饰类、接口、枚举 */
TYPE,
/** 通过ElementType.FIELD可以修饰类属性 */
FIELD,
/** 通过ElementType.METHOD可以修饰方法 */ METHOD, /** 通过ElementType.PARAMETER可以修饰参数(如构造器或者方法中的) */ PARAMETER, /** 通过ElementType.CONSTRUCTOR可以修改构造器 */ CONSTRUCTOR, /** 通过ElementType.LOCAL_VARIABLE可以修饰方法内部的局部变量 */ LOCAL_VARIABLE, /** 通过ElementType.ANNOTATION_TYPE可以修饰注解 */ ANNOTATION_TYPE, /** 通过ElementType.PACKAGE可以修饰包 */ PACKAGE, /** * 可以用在Type的声明式前 * * @since 1.8 */ TYPE_PARAMETER, /** * 可以用在所有使用Type的地方(如泛型、类型转换等) * * @since 1.8 */ TYPE_USE }
私たちは、主に追加ElementType.PACKAGEとElementType.TYPE_PARAMETERとElementType.TYPE_USE 1.8についての話します
ElementType.PACKAGE
@Target(ElementType.PACKAGE)
public @interface Table {
String value() default ""; }
意味は、パッケージを変更するために使用されるが、我々はパッケージを変更するために使用する場合、エラーを持ってい
私たちは、package-info.javaファイルを作成するために、プロンプトに従いIDEによって新しい、ここで注意取る必要がある - > Javaクラスは、新しいファイルのファイルを作成する必要性によって作成されていません
@Table
package annotation;
class PackageInfo { public void hello() { System.out.println("hello"); } }
ElementType.TYPE_PARAMETER和ElementType.TYPE_USE
彼らは類似点を持っているので、両方のは、一緒にそれを言います。Java1.8の後に追加されます
@Target(ElementType.TYPE_USE)
public @interface NoneEmpty {
String value() default ""; }
@Target(ElementType.TYPE_PARAMETER)
public @interface NoneBlank {
String value() default ""; }
明らかにElementType.TYPE_PARMETERコメントをするとき、一般的なコンパイラのみジェネリッククラス宣言のために、使用されるが、ElementType.TYPE_USEコメント@NoneEmpty缶によって変更されることはありませ@NoneBlank修正使用しています。
3.1.2 @Retention
注釈は、SOURCE、CLASS、RUNTIME含め、列挙RetentionPolicyのパラメータ、ライフサイクルを定義するために使用することができます
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
/** * Returns the retention policy. * @return the retention policy */ RetentionPolicy value(); }
public enum RetentionPolicy {
/**
* 仅存在于源代码中,编译阶段会被丢弃,不会包含于class字节码文件中.
*/
SOURCE,
/**
* 【默认策略】,在class字节码文件中存在,在类加载的时被丢弃,运行时无法获取到
*/
CLASS,
/** * 始终不会丢弃,可以使用反射获得该注解的信息。自定义的注解最常用的使用方式。 */ RUNTIME }
3.1.3 @Documented
これは、この注釈情報は、ドキュメントのjavadocに追加するかどうかを示します
3.1.4 @Inherited
サブクラス上のクラスで使用されるカスタム注釈のうち、この注釈文を使用してノートとサブクラスの間の関係の定義は、自動的にそれ以外の場合は、子はこのクラスのノートを継承しません、このコメントを継承します。ノートのうち、@Inheritedステートメントを使用すると、場合にのみ、クラスの使用、その他の無効なメソッド、プロパティ、およびように効果的であることに注意してください。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Person { String value() default "man"; }
@Person
public class Parent { } //子类也拥有@Person注解 class Son extends Parent { }
3.2アノテーションの定義された概要
@interface定義されて注意して
複数のパラメータは、コアパラメータによって合意された値を用いて、添加することができ、各パラメータのデフォルト値を設定することができ、パラメータ型は、基本的なタイプ、文字列列挙を含みます
メタデータアノテーションは、アノテーションを変更するために使用することができ、複数の素子を含むアノテーションが設定されなければならない@Target
と@Retention
、@Retention
一般的に設定しますRUNTIME
。
四。注釈処理
我々はすでに光の設定注釈を言及している、実際には、何のアクションは、対応するコードを表現したい注釈のロジックを実装する必要はありません。
注釈は、クラスを定義した後、すべてのノートがから継承されjava.lang.annotation.Annotation
、そのため、ノートを読んで、リフレクションAPIを使用する必要があります。
//定义的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Colum { String value() default ""; //用于表示某个属性代表的中文含义 String name() default ""; }
注釈と@Columは、クラスのプロパティを変更するには
public class Person {
@Colum(name = "姓名") private String name; @Colum(name = "性别") private String gender; @Colum(name = "年龄") private int age; @Colum(name = "住址") private String address; public String getName() {return name;} public void setName(String name) {this.name = name;} public String getGender() {return gender;} public void setGender(String gender) {this.gender = gender;} public int getAge() {return age;} public void setAge(int age) {this.age = age;} public String getAddress() {return address;} public void setAddress(String address) {this.address = address;} }
すべてのフィールドは、このクラスの中国の意味での反射によって読み取られ、リストを格納してからプリントアウト
public static void main(String[] args) throws ClassNotFoundException { List<String> columNames = new ArrayList<>(); Class clazz = Class.forName("annotation.Person"); //获取Person类所有属性 Field[] fields = clazz.getDeclaredFields(); for (Field field : fields){ //获取该属性的Colum注解 Colum colum = field.getAnnotation(Colum.class); //或者可以先判断有无该注解 field.isAnnotationPresent(Colum.class); //将该属性通过注解配置好的中文含义取出来放到集合中 columNames.add(colum.name()); } //打印集合 columNames.forEach((columName) -> System.out.println(columName)); }
結果は以下の通りであります:
姓名
性别
年龄
住址
例えば、我々はいくつかの一般的なシナリオを持っている、あなたは、Excelスプレッドシートにエクスポートし、ウェブサイト上で一覧表示する必要があり、我々は設定された列名の仕方によって注釈を付け、その後、反射エンティティによって読み取らエクスポートする必要があります(エクスポートする必要があるかどうか、また注釈を介して設定することができます)各フィールドの値は、可能エクスポートコンポーネントは、Excel。
V.の概要
ただ、注釈の基本的な概念を説明するためのディスカッション・ペーパーを開始する役割、機能、およびいくつかのメタ注釈の方法の使用を指摘し、簡単な例を挙げて、注釈のプロセスについて説明し、包括的ではない、紙は、分野別の基本的な注釈を説明しますAPIが、ノートはまたなど、クラス、コンストラクタ、メソッドを修正することができ、また、対応する治療は、我々は自分自身のAPIマニュアル関連の内容を確認することができます指摘し、類似したが、してください批判不完全であり、一緒に進歩を遂げることを望む、ありがとうございました!
ディレクトリ
A.注釈とは何ですか
私たちは、パターンのようなテストアノテーションは通常の開発プロセスである@、注釈は、パラメーター・マーカーの前に、クラス、コンストラクタ、メソッド、プロパティを配置し、SuppressWarnings @、など@オーバーライドとして、多くのコードを参照してください。
二つ。アノテーションの役割
クラス、メソッド...コメントを追加するには、このリンクがマークのみ行われ、コード自体は何の影響も与えないだろうに、とそれ以降のリンクを必要とする、他の方法は、ビジネス・ロジックの処理与えられたノートを必要としています。私たちは一緒に取得する方法を知って、私たちの間クリアする、他の人が戻って共有の場所にあるときにのみ、マイクロチャネルの上に配置され共有され、現時点では使用がない距離を行っているのと同じように。
3つのカテゴリに分類ノート:
2.1コンパイラはコメントを使用しています
SuppressWarningsがコメントすることをコンパイラで使用されている@このような@オーバーライドとして、それがコンパイルされた.classファイルに行かなくても、コンパイラ何かを伝えることです。
@Override:親クラスかどうかを確認する方法を書き換えるようにコンパイラに伝えます。
@SuppressWarnings:生成されたコードの警告セクションを無視するようにコンパイラに伝えます。
開発者にとっては、それがさらなる行動せずに直接使用されています
2.2 .classファイルノートへ
ツールで注釈付きのバイトコード.classファイルにいくつかの変更を加える必要があるとき、いくつかのクラスのロード、の.classファイルの注釈で表さ動的変更、ツールはいくつかの特別な機能を実現するために、設定され、1回の処理が完了すると、メモリ内に存在しない場合、フレームワークは、一般的に関与していない、開発者のために使用する、非常に低レベルのツールライブラリです。
2.3ランタイム読み取りノート
JVMに存在しており、ノートは、運転中に読み取ることができ、最も一般的に使用される注釈はAutoWired、@マッパーのMyBatisの、@TestのJUnitの、など、これらのノート@、@、このようなサービス、@コントローラ@春、として、リポジトリであります多くのツールは、カスタムフレームワークは、一般的な開発者はまた、コメントのこのタイプをカスタマイズすることができ、操作のノートの間に特別な役割を果たしています。
III。定義注釈
私たちは、コメントを定義するために使用@interface
/**
* 定义一个Table注解
*/
public @interface Table {
String value() default ""; }
/**
* 定义一个Colum注解
*/
public @interface Colum {
String value() default ""; String name() default ""; String dictType() default ""; }
これは単に、注釈の良い定義されます
私たちは、String型のコメント主な使用上で定義されたが、実際には、基本的なデータ型(ない梱包など)、列挙型ことができます。
ノートは、通常の状況下で、我々は、デフォルトのパラメータでデフォルトを設定する一方、最も一般的なパラメータは、値の名前べきである条約の何かを持っています。
しかし、これは、それを私たちの使用に満足することはありませんが、私はしたい@Table
クラスにのみコメント、@Colum
注釈は、プロパティでのみ使用され、どのように?そして、冒頭で述べた3つの音、開発者はノートの一般的な実行で使用されているが、我々はそれを定義することですか?
これらの質問に答えるために、我々は、の概念を導入する必要があり、「メタアノテーションを。」
3.1元のメモ
注釈を変更することができるJavaはメタアノテーションの数を定義している、私たちが直接使用することができ、メタ注釈の注釈です。
3.1.1 @Target
名前が示唆するように、目標オブジェクトパラメータを指定するためのアノテーションの使用は]のElementTypeあります[
public @interface Target {
/**
* Returns an array of the kinds of elements an annotation type
* can be applied to.
* @return an array of the kinds of elements an annotation type
* can be applied to
*/
ElementType[] value();
}
以下に定義されたプロパティのElementType列挙であり、TYPE_PARAMETER離れて、ターゲットを設定しない、TYPE_USE、他の部分は、構成に相当します。
public enum ElementType {
/** 通过ElementType.TYPE可以修饰类、接口、枚举 */
TYPE,
/** 通过ElementType.FIELD可以修饰类属性 */
FIELD,
/** 通过ElementType.METHOD可以修饰方法 */ METHOD, /** 通过ElementType.PARAMETER可以修饰参数(如构造器或者方法中的) */ PARAMETER, /** 通过ElementType.CONSTRUCTOR可以修改构造器 */ CONSTRUCTOR, /** 通过ElementType.LOCAL_VARIABLE可以修饰方法内部的局部变量 */ LOCAL_VARIABLE, /** 通过ElementType.ANNOTATION_TYPE可以修饰注解 */ ANNOTATION_TYPE, /** 通过ElementType.PACKAGE可以修饰包 */ PACKAGE, /** * 可以用在Type的声明式前 * * @since 1.8 */ TYPE_PARAMETER, /** * 可以用在所有使用Type的地方(如泛型、类型转换等) * * @since 1.8 */ TYPE_USE }
私たちは、主に追加ElementType.PACKAGEとElementType.TYPE_PARAMETERとElementType.TYPE_USE 1.8についての話します
ElementType.PACKAGE
@Target(ElementType.PACKAGE)
public @interface Table {
String value() default ""; }
意味は、パッケージを変更するために使用されるが、我々はパッケージを変更するために使用する場合、エラーを持ってい
私たちは、package-info.javaファイルを作成するために、プロンプトに従いIDEによって新しい、ここで注意取る必要がある - > Javaクラスは、新しいファイルのファイルを作成する必要性によって作成されていません
@Table
package annotation;
class PackageInfo { public void hello() { System.out.println("hello"); } }
ElementType.TYPE_PARAMETER和ElementType.TYPE_USE
彼らは類似点を持っているので、両方のは、一緒にそれを言います。Java1.8の後に追加されます
@Target(ElementType.TYPE_USE)
public @interface NoneEmpty {
String value() default ""; }
@Target(ElementType.TYPE_PARAMETER)
public @interface NoneBlank {
String value() default ""; }
明らかにElementType.TYPE_PARMETERコメントをするとき、一般的なコンパイラのみジェネリッククラス宣言のために、使用されるが、ElementType.TYPE_USEコメント@NoneEmpty缶によって変更されることはありませ@NoneBlank修正使用しています。
3.1.2 @Retention
注釈は、SOURCE、CLASS、RUNTIME含め、列挙RetentionPolicyのパラメータ、ライフサイクルを定義するために使用することができます
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
/** * Returns the retention policy. * @return the retention policy */ RetentionPolicy value(); }
public enum RetentionPolicy {
/**
* 仅存在于源代码中,编译阶段会被丢弃,不会包含于class字节码文件中.
*/
SOURCE,
/**
* 【默认策略】,在class字节码文件中存在,在类加载的时被丢弃,运行时无法获取到
*/
CLASS,
/** * 始终不会丢弃,可以使用反射获得该注解的信息。自定义的注解最常用的使用方式。 */ RUNTIME }
3.1.3 @Documented
これは、この注釈情報は、ドキュメントのjavadocに追加するかどうかを示します
3.1.4 @Inherited
サブクラス上のクラスで使用されるカスタム注釈のうち、この注釈文を使用してノートとサブクラスの間の関係の定義は、自動的にそれ以外の場合は、子はこのクラスのノートを継承しません、このコメントを継承します。ノートのうち、@Inheritedステートメントを使用すると、場合にのみ、クラスの使用、その他の無効なメソッド、プロパティ、およびように効果的であることに注意してください。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Person { String value() default "man"; }
@Person
public class Parent { } //子类也拥有@Person注解 class Son extends Parent { }
3.2アノテーションの定義された概要
@interface定義されて注意して
複数のパラメータは、コアパラメータによって合意された値を用いて、添加することができ、各パラメータのデフォルト値を設定することができ、パラメータ型は、基本的なタイプ、文字列列挙を含みます
メタデータアノテーションは、アノテーションを変更するために使用することができ、複数の素子を含むアノテーションが設定されなければならない@Target
と@Retention
、@Retention
一般的に設定しますRUNTIME
。
四。注釈処理
我々はすでに光の設定注釈を言及している、実際には、何のアクションは、対応するコードを表現したい注釈のロジックを実装する必要はありません。
注釈は、クラスを定義した後、すべてのノートがから継承されjava.lang.annotation.Annotation
、そのため、ノートを読んで、リフレクションAPIを使用する必要があります。
//定义的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Colum { String value() default ""; //用于表示某个属性代表的中文含义 String name() default ""; }
注釈と@Columは、クラスのプロパティを変更するには
public class Person {
@Colum(name = "姓名") private String name; @Colum(name = "性别") private String gender; @Colum(name = "年龄") private int age; @Colum(name = "住址") private String address; public String getName() {return name;} public void setName(String name) {this.name = name;} public String getGender() {return gender;} public void setGender(String gender) {this.gender = gender;} public int getAge() {return age;} public void setAge(int age) {this.age = age;} public String getAddress() {return address;} public void setAddress(String address) {this.address = address;} }
すべてのフィールドは、このクラスの中国の意味での反射によって読み取られ、リストを格納してからプリントアウト
public static void main(String[] args) throws ClassNotFoundException { List<String> columNames = new ArrayList<>(); Class clazz = Class.forName("annotation.Person"); //获取Person类所有属性 Field[] fields = clazz.getDeclaredFields(); for (Field field : fields){ //获取该属性的Colum注解 Colum colum = field.getAnnotation(Colum.class); //或者可以先判断有无该注解 field.isAnnotationPresent(Colum.class); //将该属性通过注解配置好的中文含义取出来放到集合中 columNames.add(colum.name()); } //打印集合 columNames.forEach((columName) -> System.out.println(columName)); }
結果は以下の通りであります:
姓名
性别
年龄
住址
例えば、我々はいくつかの一般的なシナリオを持っている、あなたは、Excelスプレッドシートにエクスポートし、ウェブサイト上で一覧表示する必要があり、我々は設定された列名の仕方によって注釈を付け、その後、反射エンティティによって読み取らエクスポートする必要があります(エクスポートする必要があるかどうか、また注釈を介して設定することができます)各フィールドの値は、可能エクスポートコンポーネントは、Excel。
V.の概要
ただ、注釈の基本的な概念を説明するためのディスカッション・ペーパーを開始する役割、機能、およびいくつかのメタ注釈の方法の使用を指摘し、簡単な例を挙げて、注釈のプロセスについて説明し、包括的ではない、紙は、分野別の基本的な注釈を説明しますAPIが、ノートはまたなど、クラス、コンストラクタ、メソッドを修正することができ、また、対応する治療は、我々は自分自身のAPIマニュアル関連の内容を確認することができます指摘し、類似したが、してください批判不完全であり、一緒に進歩を遂げることを望む、ありがとうございました!