java 註解(Annotation)
阿新 • • 發佈:2019-02-09
從 JDK 5.0 開始, Java 增加了對元資料(MetaData) 的支援, 也就是 Annotation(註解)。
Annotation 其實就是程式碼裡的特殊標記, 這些標記可以在編譯, 類載入, 執行時被讀取, 並執行相應的處理. 通過使用 Annotation, 程式設計師可以在不改變原有邏輯的情況下, 在原始檔中嵌入一些補充資訊。
Annotation 可以像修飾符一樣被使用, 可用於修飾包,類, 構造器, 方法, 成員變數, 引數, 區域性變數的宣告, 這些資訊被儲存在 Annotation 的 “name=value” 對中。
Annotation 能被用來為程式元素(類, 方法, 成員變數等) 設定元資料。
使用 Annotation 時要在其前面增加 @ 符號, 並把該 Annotation 當成一個修飾符使用。用於修飾它支援的程式元素
三個基本的 Annotation:
@Override: 限定重寫父類方法, 該註解只能用於方法
@Deprecated: 用於表示某個程式元素(類, 方法等)已過時
@SuppressWarnings: 抑制編譯器警告
自定義Annotation
定義新的 Annotation 型別使用 @interface 關鍵字
Annotation 的成員變數在 Annotation 定義中以無引數方法的形式來宣告. 其方法名和返回值定義了該成員的名字和型別.
可以在定義 Annotation 的成員變數時為其指定初始值, 指定成員變數的初始值可使用 default 關鍵字
public @interface MyAnnotation{
String name() default “atguigu";
}
沒有成員定義的 Annotation 稱為標記; 包含成員變數的 Annotation 稱為元資料 Annotation
JDK 5.0 在 java.lang.reflect 包下新增了 AnnotatedElement 介面, 該介面代表程式中可以接受註解的程式元素.
當一個 Annotation 型別被定義為執行時 Annotation 後, 該註釋才是執行時可見, 當 class 檔案被載入時儲存在 class 檔案中的 Annotation 才會被虛擬機器讀取.
JDK5.0提供了專門在註解上的註解型別,分別是:
Retention
Target
Documented
Inherited
@Retention: 只能用於修飾一個 Annotation 定義, 用於指定該 Annotation 可以保留多長時間, @Rentention 包含一個 RetentionPolicy 型別的成員變數, 使用 @Rentention 時必須為該 value 成員變數指定值:
RetentionPolicy.SOURCE: 編譯器直接丟棄這種策略的註解
RetentionPolicy.CLASS: 編譯器將把註解記錄在 class 檔案中. 當執行 Java 程式時, JVM 不會保留註解。 這是預設值
RetentionPolicy.RUNTIME:編譯器將把註釋記錄在 class 檔案中. 當執行 Java 程式時, JVM 會保留註解. 程式可以通過反射獲取該註解
public enum RetentionPolicy{
SOURCE,
CLASS,
RUNTIME
}
@Target: 用於修飾 Annotation 定義, 用於指定被修飾的 Annotation 能用於修飾哪些程式元素. @Target 也包含一個名為 value 的成員變數。
@Documented: 用於指定被該元 Annotation 修飾的 Annotation 類將被 javadoc 工具提取成文件.
定義為Documented的註解必須設定Retention值為RUNTIME。
@Inherited: 被它修飾的 Annotation 將具有繼承性.如果某個類使用了被 @Inherited 修飾的 Annotation, 則其子類將自動具有該註解。
package com.tz.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public class AnnotationTest {
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.FIELD})
public @interface MyAnnotation{
String names() default "Jery";
}
}
package com.tz.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface MyTiger {
String value() default "小趙";
int age();
}
package com.tz.annotation;
import java.lang.reflect.Method;
public class Person {
private String name;
@MyTiger(age = 20)
public void setName(String name){
this.name = name;
}
@Override
public String toString(){
return "";
}
public static void main(String[] args) {
//通過反射獲取方法上的註解
Class class1 = Person.class;
for( Method method:class1.getDeclaredMethods()){
// System.out.println(method);
// for(Annotation an:method.getAnnotations()){
// System.out.println(an);
// }
MyTiger an = method.getAnnotation(MyTiger.class);
//System.out.println(method+"==========="+an);
if(an!=null){
System.out.println(method+"==="+an.value()+"==="+an.age());
}
}
}
}