注釈
1.コンセプト
(1)注釈:プログラムを説明するために使用され、コンピューターがJDK1.5以降の新機能を確認できるようにします
。@注解名称
(2)注釈:コーダー向けにプログラムをテキストで説明する
2.機能
(1)ドキュメント
を作成するコードで識別された注釈からドキュメントドキュメントを生成します。
①クラスを作成する
/**
* 注解javadoc演示
* @author 周杰伦 表示此类(文档)作者
* @version 1.0 表示此类(文档)的版本
* @since 1.8 表示从JDK1.8之后可以使用此类
*/
public class AnnoDemo1 {
/**
* 计算两数的和
* @param a 整数
* @param b 整数
* @return 两数的和
*/
public int add(int a, int b ){
return a + b;
}
}
②このJavaファイルにはjavadoc命令を使用してください
③ドキュメントファイルを開く
(2)コード分析:リフレクションを使用して、コード内の注釈を介してコードを分析します
(3)コンパイルチェック:アノテーションなどでコンパイルチェックを実現@Override
3.カスタム注釈
(1)フォーマット
public @interface 注解名称 {
// 属性列表;
}
(2)エッセンス
アノテーションは基本的に、次のように、デフォルトでアノテーションインターフェイスを継承するインターフェイスです。
public interface 自定义注解 extends java.lang.annotation.Annotation {
}
(3)注釈の属性
注釈付き属性は、インターフェースの抽象メソッドです
請求:
①プロパティの戻り値の型:
i。基本データ型
ii。文字列型文字列
iii。列挙型
iiii。注
iiiii。上記の型の配列
注:クラス型やvoidなどの他の型は使用できません。
②属性を定義した後、属性を使用する場合は属性に値を割り当てる必要があります
// 自定义注解
public @interface MyAnno {
//以下均为省略了abstract关键字的抽象方法
Person per(); //枚举类型,其中有P1,P2
MyAnno2 anno2(); // 注解类型,定义另一个注解MyAnno2
String[] strs(); // 数组类型
//使用default关键字给属性赋值,表示默认初始值,
//则使用注解时,可以不给此属性赋值,而使用默认值
int value() default 15; //基本数据类型
}
// 使用注解
// 数组赋值时,值使用{}包裹,如果数组中只有一个值,可以省略{}
@MyAnno(per = Person.P1, anno2 = @MyAnno2, strs={
"bbb", "ccc"})
public class Worker {
// 自定义类
//成员变量、属性
}
注意:
-
アノテーションに属性が1つしかなく、名前がvalueの場合、値のタイプに関係なく、値を割り当てるときに値を省略でき、値は次のように直接定義できます。
@SuppressWarnings(“all”)
-
同じクラスまたはメソッドに対して、複数の異なるアノテーションを同時に使用できます
4.メタアノテーション
注釈を説明するために使用される注釈。カスタム注釈の上の行にメタ注釈を記述します。4つのタイプがあります。
(1)@Target
:アノテーションが機能できる位置を記述します。
属性:ElementType [] value();その中で、ElementTypeは列挙型であり、一般的に使用される値です。
- TYPEは、クラスに作用できることを意味します
- METHODは、メソッドに作用できることを意味します
- FIELDは、変数に作用できることを意味します
(2)@Retention
:注釈が保持される段階を記述します。
属性:RetentionPolicy value();ここで、RetentionPolicyは列挙型であり、その値は次のとおりです。
- RUNTIMEは、現在のアノテーションがクラスファイルに保持され、JVMによって読み取られることを意味します。この値は最も一般的に使用され、値SOURCE、CLASSを取ることもできます。
(3)@Documented
:説明的なコメントをAPIドキュメントに抽出できます
(4)@Inherited
:記述アノテーションを継承可能:親クラスがこのメタアノテーションで記述されたアノテーションを使用する場合、このクラスを継承するサブクラスは、アノテーションを書き込まなくても自動的にこのアノテーションで記述されます。
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
//自定义注解Pro
public @interface Pro {
String className();
String methodName();
}
5.注釈の属性値を取得します
// 使用上述自定义注解Pro
@Pro(className = "cn.itcast.annotation.Demo1", methodName = "show")
public class ReflectTest {
public static void main(String[] args) throws Exception {
// 1. 使用该类的字节码文件对象解析注解
Class<ReflectTest> reflectTestClass = ReflectTest.class;
// 2. 获取指定的注解对象
Pro an = reflectTestClass.getAnnotation(Pro.class);
// 第二步其实就是在内存中生成了一个该注解接口的子类实现对象
/*
public class ProImpl implements Pro{
public String className(){
return "cn.itcast.annotation.Demo1";
}
public String methodName(){
return "show";
}
}
*/
// 3. 调用注解对象中定义的抽象方法,获取返回值
String className = an.className();
String methodName = an.methodName();
System.out.println(className); //cn.itcast.annotation.Demo1
System.out.println(methodName); //show
}
}
注:複数のアノテーションを使用する場合は、ClassオブジェクトのnullパラメーターgetAnnotation()メソッドを呼び出して、すべてのアノテーションオブジェクトを取得し、Annoation []を返します。