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定義的元註解:
- @Target
- @Retention
- @Documented
- @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註解一共分三類。
- @Override:告知編譯器此方法是覆蓋父類的
- @Deprecated:標註過時@Deprecated:標註過時
- @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());
}
}