Java開発者は、カスタムアノテーションを実装します
ハッハッハ、最近私は自分のものを練習する時間を持って、最後に、非常に好奇心旺盛コメント後者はそれを使用する場合には、それを記録するために開発されました
まず、我々は標準試料のカスタム注釈を見て、クラス宣言の上に注釈のキーワード@interfaceの変更や注釈情報を使用して、アノテーションクラスには、情報の次の4つの種類が含まれています
@Documented - ノートはJavaDocの中に含まれるかどうか
@Retention - ときアノテーションを使用します
@Target - 何のためのノート
@Inherited - サブクラスがコメントを継承できるようにするかどうか
。1)保持@ -注釈ライフサイクルの定義
●のRetentionPolicy.SOURCE:コンパイル時に破棄。コンパイラの最後にこれらのアノテーションは、もはや彼らは、バイトコードを書いていない、何の意味もありません。@Override、@SuppressWarningsは、このようなコメントに属します。
●RetentionPolicy.CLASS:クラスのロード破棄。便利なバイトコードファイル。デフォルトでこの方法を使用しNOTE
●のRetentionPolicy.RUNTIMEは:あなたは注釈情報を読み取るためにリフレクションを使用できるようにも、ノートを保つ実行を破棄されることはありません。一般的にこのように使用される当社のカスタム注釈します。
2)ターゲット-ここで注釈が使用されていることを示しています。デフォルト値は、注釈がどこかで使用されていることを示す、任意の要素です。使用可能なパラメータは、のElementType含む
●ElementType.CONSTRUCTORを:コンストラクタを記述するために使用され
●ElementType.FIELD:(列挙例を含む)のメンバー変数、オブジェクト、プロパティ
●ElementType.LOCAL_VARIABLE:記述するために使用されるローカル変数
●ElementType.METHODを:記述する方法
●ElementType.PACKAGE:説明するためのパッケージ
●ElementType.PARAMETERを:記述するために使用されるパラメータ
●ElementType.TYPEを:クラス、(注釈のタイプを含む)インターフェース、または列挙宣言を説明するための
3)文書化@ - 。簡単な注釈情報はJavaドキュメントに追加するかどうかを示すメモ、注釈をマーク。
4)継承@ -音符とサブクラスとの間の関係を定義
@継承、メタアノテーション@Inheritedマーカー注釈であるインデックス付きの特定のタイプが継承されている記載されています。修飾@Inherited注釈型を用いたものをクラスに使用される場合、このアノテーションは、このクラスのサブクラスで使用されています。
声明>>カスタム注釈クラス
@Target(値= {ElementType.TYPE、ElementType.METHOD 、ElementType.FIELD}) スコープ現在のアノテーションクラスのクラスメソッド属性を指定しています
実行注釈、注釈情報を保持する@Retention(値= RetentionPolicy.RUNTIME)は、反射によって読み取ることができます
com.gaunyi.batteryonline.annotationパッケージ; インポートjava.lang.annotation.ElementType; インポートjava.lang.annotation.Retention; インポートjava.lang.annotation.RetentionPolicy; インポートjava.lang.annotation.Target; / ** *初出2019年8月20日S0111 ONによる。 *カスタム注釈クラス宣言 * / @Target(値= {ElementType.TYPE、ElementType.METHOD、ElementType.FIELD}) @Retention(値= RetentionPolicy.RUNTIME) パブリック{@interfaceのMyAnnotationDefinition
/ *注釈情報内のパラメータを定義する* / 文字列名(); String値(); 文字列のパス(); }
>>カスタムアノテーションを使用します
プロパティ注釈の各クラス、メソッド、情報に
package com.gaunyi.batteryonline.annotation; /** * Created by S0111 on 2019/8/20. * 自定义注解类使用 */ @MyAnnotationDefinition(name="类名称",value="类值",path="类路径") public class MyAnnotationUse { @MyAnnotationDefinition(name="属性名",value="属性值",path="属性路径") private String name; @MyAnnotationDefinition(name="年龄",value="18",path="/user2") private String age; @MyAnnotationDefinition(name="方法名",value="方法值",path="方法访问路径") public String testAnno(){ return "successs!!!"; } @MyAnnotationDefinition(name="方法名1",value="方法值1",path="方法访问路径1") public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
>> 读取注解信息(测试注解类)
这里通过反射读取注解信息,注解内容与对应的类、方法、属性对应。
package com.gaunyi.batteryonline.annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* Created by S0111 on 2019/8/20.
* 自定义注解类测试
*/
public class MyAnnotationTest {
public static void main(String[] args) throws Exception{
Class clazz = Class.forName("com.gaunyi.batteryonline.annotation.MyAnnotationUse");
//获取类注解信息
MyAnnotationDefinition classAnno =(MyAnnotationDefinition) clazz.getAnnotation(MyAnnotationDefinition.class);
System.out.println( classAnno.name()+"---"+classAnno.value()+"---"+classAnno.path());
//获取所以方法注解信息 ps:这里需要使用 isAnnotationPresent 判断方法上是否使用了注解
Method[] allMethods = clazz.getDeclaredMethods();
for(int i=0;i<allMethods.length;i++){
if(allMethods[i].isAnnotationPresent(MyAnnotationDefinition.class)) {
MyAnnotationDefinition methodAnno = allMethods[i].getAnnotation(MyAnnotationDefinition.class);
System.out.println("遍历:当前方法名为:"+allMethods[i].getName()+" 的注解信息:---"+methodAnno.name() + "---" + methodAnno.value() + "---" + methodAnno.path());
}
}
//获取指定方法注解信息
Method methodTest = clazz.getDeclaredMethod("testAnno");
MyAnnotationDefinition methodAnnotest = methodTest.getAnnotation(MyAnnotationDefinition.class);
System.out.println( methodAnnotest.name()+"---"+methodAnnotest.value()+"---"+methodAnnotest.path());
//获取属性注解信息
Field nameField = clazz.getDeclaredField("name");
MyAnnotationDefinition attrAnno = nameField.getAnnotation(MyAnnotationDefinition.class);
System.out.println( attrAnno.name()+"---"+attrAnno.value()+"---"+attrAnno.path());
}
}
>>测试结果如下:
至此我们就实现了自定义注解啦.... 关于自定义注解的实际应用,待我使用时再来更新...