1. 程式人生 > >Java中的註解

Java中的註解

1.瞭解註解

註解很重要,未來的開發模式都是基於註解,註解是一種趨勢,現在已經有不少人開始使用註解了,註解是JDK1.5之後才有的新特性。包含在java.lang.annotation包中,它是附加在程式碼中的一些元資訊,將一個類的外部資訊和內部成員聯絡起來,在編譯、執行時進行解析和使用。Java內建了一些註解,還支援自定義註解,一些知名的框架都有自己實現的自定義註解,也可以自己定義註解供使用。

註解的一般格式是[修飾符] @interface [名稱] {元素},元素是無方法體的方法宣告,可以有預設值。

2.元註解

@Target({ElementType.METHOD,ElementType.
TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Description { String desc(); String author(); int age() default 18; }

元註解的作用是負責註解其他註解,註解的註解。Java5.0定義了4個標準的meta-annotation型別,它們用來對其他annotation型別作說明。Java5.0定義的元註解:

  1. @Target
  2. @Retention
  3. @Documented
  4. @Inherited

@Target:

說明了註解所修飾的物件範圍。取值是來源於Java.lang.annotation。ElementType的列舉型別元素:

	1.CONSTRUCTOR:用於描述構造器
	2.FIELD:用來描述域
	3.LOCAL_VARIABLE:用於描述區域性變數
	4.METHOD:用於描述方法
	5.PACKAGE:用於描述包
	6.PARAMETER:用於描述引數
	7.TYPE:用於描述類、介面(包括註解型別)或enum宣告

@Retention:

@Retention定義了該Annotation被保留的時間長短。取值來java.lang.annotation.RetentionPolicy的列舉型別值:

1.SOURCE:在原始檔中有效(即原始檔保留)
2.CLASS:在class檔案中有效(即class保留)
3.RUNTIME:在執行時有效(即執行時保留)

@Documented:
@Documented用於描述其他型別的annotation應該被作為標註的程式成員的公共API,因此可以被例如javadoc此類的工具文件化。Documented是一個標記註解,沒有成員。

@Inherited:
@Inherited元註解是一個標記註解,@Inherited闡述了某個被標註的型別是被繼承的。如果一個使用了@Inherited修飾的annotation型別被用於一個class,則這個annotation將被用於該class的子類。

3.JDK的註解

1.JDK註解

JDK註解一共分三類。
在這裡插入圖片描述

  1. @Override:告知編譯器此方法是覆蓋父類的
  2. @Deprecated:標註過時@Deprecated:標註過時
  3. @SuppressWarnings:壓制警告

4.註解實現的例項

註解通過反射獲取。首先可以通過 Class 物件(實現了AnnotatedElement介面)的 isAnnotationPresent() 方法判斷它是否應用了某個註解

 public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {}

然後通過 getAnnotation() 方法來獲取 Annotation 物件。

public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {}

或者是 getAnnotations() 方法。

public Annotation[] getAnnotations() {}

前一種方法返回指定型別的註解,後一種方法返回註解到這個元素上的所有註解。

如果獲取到的 Annotation 如果不為 null,則就可以呼叫它們的屬性方法了。

實現註解需要的三個條件:註解宣告、使用註解的元素、操作註解使其起作用
1.定義一個MyTag的註解類:

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.FIELD})
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTag {
	String name() default "車";
	int size() default 10;
}

實體類:

public class Car {
	private String name;
	private int size;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getSize() {
		return size;
	}
	public void setSize(int size) {
		this.size = size;
	}
	public Car(String name,int size){
		this.name = name;
		this.size = size;
	}
}

2.使用註解的類

public class AnnotationDemo {
	@MyTag(name="audi",size=10)
	private Car car;
	public Car getCar() {
		return car;
	}
	public void setCar(Car car) {
		this.car = car;
	}
}

3.註解處理類
向註解處理類中傳入要是使用註解的類:

public class AnnotationProccessor {
	public static void annoProcess(AnnotationDemo annotation){
		for(Field field:annotation.getClass().getDeclaredFields()){
			//使用反射得到域上面的註解
			MyTag myTag = field.getAnnotation(MyTag.class);
			//處理
			annotation.setCar(new Car(myTag.name(),myTag.size()));
		}
	}
}

4.測試類

public class TestDemo {
	public static void main(String[] args) {
		AnnotationDemo anDemo = new AnnotationDemo();
		AnnotationProccessor annoProcess = new AnnotationProccessor();
		annoProcess.annoProcess(anDemo);
		System.out.println(anDemo.getCar().getName());
	}
}