怎樣理解Java的註解並運用註解編程

2019-08-05   指尖上的代碼

先來看下概念,首先從注釋來看。

注釋:給代碼添加說明和解釋,注釋幫助開發人員理解程序。(Comment)說白點就是注釋是給人看的。

註解:給代碼添加說明解釋,這個說明給程序使用。(Annotation)

從 JDK 5.0 開始,Java 增加了對元數據(MetaData) 的支持, 也就是Annotation(註解)。

三個基本的 Annotation:

@Override:限定重寫父類方法, 該註解只能用於方法

@Deprecated:用於表示某個程序元素(類, 方法等)已過時

@SuppressWarnings: 抑制編譯器警告.

什麼是註解

Annotation其實就是代碼里的特殊標記, 它用於替代配置文件,也就是說,傳統方式通過配置文件告訴類如何運行,有了註解技術後,開發人員可以通過註解告訴類如何運行。在Java技術里註解的典型應用是:可以通過反射技術去得到類裡面的註解,以決定怎麼去運行類。

註解技術的要點:

如何定義註解

如何反射註解,並根據反射的註解信息,決定如何去運行類

1.自定義註解:

定義新的 Annotation 類型使用@interface關鍵字

聲明註解的屬性

註解屬性的作用:原來寫在配置文件中的信息,可以通過註解的屬性進行描述。

Annotation的屬性聲明方式:String name();

屬性默認值聲明方式:Stringname() default 「xxx」;

特殊屬性value:如果註解中有一個名稱value的屬性,那麼使用註解時可以省略value=部分,如@MyAnnotation(「xxx")

特殊屬性value[];

註解屬性的類型可以是:

String類型

基本數據類型

Class類型

枚舉類型

註解類型

以上類型的一維數組

案例演示1 創建和使用註解

public @interface MyAnnocation {

String name();

int num() default 10;

MyAnnocation2 anno();

}

public @interface MyAnnocation2 {

String value();

}

public class Demo1 {

@MyAnnocation(name="哈哈",num=50,anno=@MyAnnocation2(value = "xxx"))

public void show() {

System.out.println("xxxxxxx");

}

}

2.JDK的元 Annotation

元 Annotation指修飾Annotation的Annotation。

@Retention: 只能用於修飾一個 Annotation 定義, 用於指定該 Annotation 可以保留的域, @Rentention 包含一個 RetentionPolicy 類型的成員變量, 通過這個變量指定域。

RetentionPolicy.CLASS: 編譯器將把註解記錄在 class文件中. 當運行 Java 程序時, JVM 不會保留註解. 這是默認值

RetentionPolicy.RUNTIME:編譯器將把註解記錄在 class文件中. 當運行 Java 程序時, JVM 會保留註解. 程序可以通過反射獲取該注釋

RetentionPolicy.SOURCE: 編譯器直接丟棄這種策略的注釋

@Target:指定註解用於修飾類的哪個成員.@Target 包含了一個名為value,類型為ElementType的成員變量。

@Documented:用於指定被該元 Annotation 修飾的Annotation類將被 javadoc 工具提取成文檔。

@Inherited:被它修飾的 Annotation 將具有繼承性.如果某個類使用了被 @Inherited 修飾的Annotation,則其子類將自動具有該註解。

案例演示2 使用反射獲取註解信息

@Retention(RetentionPolicy.RUNTIME)

public @interface PersonInfo {

String name();

int age() default 20;

String gender();

}

public class PersonOpe {

@PersonInfo(name="李四",age=20,gender="男")

public void show(String name,int age,String gen) {

System.out.println(name);

System.out.println(age);

System.out.println(gen);

}

}

public class Demo2 {

public static void main(String[] args) throws Exception{

PersonOpe ope=new PersonOpe();

Class class1=PersonOpe.class;

Method method = class1.getMethod("show", String.class,int.class,String.class);

PersonInfo annotation = method.getAnnotation(PersonInfo.class);

String name=annotation.name();

int age=annotation.age();

String gender=annotation.gender();

method.invoke(ope, name,age,gender);

}

}