Java之註解初探

1. 什麼是註解(Annotation)

    JDK1.5開始,Java增長了對元數據(即類的組成單元數據)的支持,也就是註解(Annotation),他是代碼裏作的特殊標記,這些標記能夠在編譯、類加載、運行時在不改變原有邏輯的狀況下被讀取,並執行相應的處理,經過使用Annotation,程序員能夠在原文件中嵌入一些補充的信息。代碼分析工具、開發工具和部署工具能夠經過這些補充信息進行驗證或者進行部署。Annotation相似於修飾符同樣被使用,能夠用於包、類、構造方法、方法、成員變量、參數、局部變量的聲明。
java

注意:Annotation是個接口,程序能夠經過反射來獲取指定的程序元素的Anotation對象,而後經過Annotation對象來得到註解裏面的元數據。Annotation有時是指java.lang.Annotation,有時指註解自己。程序員

2. 系統定義的三個Annotation

在JDK1.5以後,在系統中提供了三個Annotation,分別是:@Override、@Deprecated、@SuppressWarningside

@Override工具

它的做用是對覆蓋超類中方法的方法進行標記,若是被標記的方法並無實際覆蓋超類中的方法,則編譯器會發出錯誤警告。開發工具

@Deprecated測試

表示這一個類或方法已過期,再也不建議繼續使用了。
spa

@SuppressWarningscode

表示關閉不當的編譯器警告信息。
對象

其參數有:
接口

deprecation,使用了過期的類或方法時的警告

unchecked,執行了未檢查的轉換時的警告

fallthrough,當Switch程序塊直接通往下一種狀況而沒有break時的警告

path,在類路徑、源文件路徑等中有不存在的路徑時的警告

finally,任何finally子句不能正常完成時的警告

all,關於以上全部狀況的警告

下面看一個小例子:

package com.main;

public class Person {

	@Override
	public String toString() {
		return "測試@Override";
	}

	@Deprecated
	public void print() {
		System.out.println("測試@Deprecated");
	}

}

3. 自定義Annotation

註解應用須要三個步驟:

  1. 編寫註釋

  2. 在類上應用註釋

  3. 對應用了註釋的類進行反射操做的類

    自定義Annotation的語法以下:

    訪問控制權限 @interface Annotation名稱{}

    例如:

    public @interface MyAnnotation{}

package com.main;

/**
 * 自定義註解
 * @author lenovo
 */
public @interface MyAnnotation {
	// 定義變量
	public String name();
	public int age();
	public String info() default "學生";// 爲變量info設置默認值
}
package com.main;

@MyAnnotation(age = 18, name = "小明")
public class Person {

4. Retention和RetentionPolicy

Annotation要想決定其做用的範圍,能夠經過@Retention指定,而Retention指定的範圍由RetentionPolicy決定,RetentionPolicy指定了三種範圍:

範圍 描述
public static final RetentionPolicy SOURCE 在java源程序中存在
public static final RetentionPolicy CLASS 在java生成的class中存在
public static final RetentionPolicy RUNTIME 在java運行的時候存在

示例:

package com.main;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * 自定義註解
 * @author lenovo
 */
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
	// 定義變量
	public String name();
	public int age();
	public String info() default "學生";// 爲變量info設置默認值
}

5. 反射與Annotation

一個Annotation真正起做用,必須結合反射機制,在反射中提供瞭如下的操做方法:

java.lang.reflect.AccessibleObject

方法名稱 描述
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) 判斷是不是指定的Annotation
public Annotation[] getAnnotations()
獲得所有的Annotation

實例:

package com.main;

import java.lang.annotation.Annotation;

public class AnnotationTest {
	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException {
		Class personClass = Person.class;
		Annotation annotation = personClass.getAnnotation(MyAnnotation.class);
		MyAnnotation myAnnotation = (MyAnnotation) annotation;
		String name = myAnnotation.name();
		int age = myAnnotation.age();

		Person p1 = (Person) personClass.newInstance();
		p1.setName(name);
		p1.setAge(age);
		
		System.out.println(p1);
	}

}
相關文章
相關標籤/搜索