注解
-
注解的理解:
- 注解(Annotation)也被稱為元資料(Metadata),用于修飾包、類、方法、屬性、構造器、區域變數等資料資訊,
- 和注釋一樣,注解不影響程式邏輯,但注解可以被編譯或運行,相當于嵌入在代碼中的補充資訊,
- 在Java SE中,注解的使用目的比較簡單,例如標記過時的功能,忽略警告等,在Java EE中注解占據了更重要的角色,例如用來配置應用程式的任何切面,代替Java EE舊版中所遺留的繁冗代碼和XML配置等,
-
基本介紹:
使用Annotation 時要在其前面增加 @ 符號,并把 Annotation 當成一個修飾符使用,用于修飾它支持阿程式元素,
三個基本的 Annotation:
- @Override:限定某個方法,是重寫父類方法,該注解只能用于方法,
- @Deprecated:用于表示某個程式元素(類,方法等)已過時,
- @SuppressWarnings:抑制編譯器警告,
一、 @Override 注解
@Override:限定某個方法,是重寫父類方法,該注解只能用于方法,
class Father {
public void fly() {
}
}
class Son extends Father {
//1. @Override 注解放在fly方法上,表示子類的fly方法重寫父類的fly
//2. 如果這里沒有寫 @Override 還是會重寫父類的fly
//3. 如果你寫了 @Override注解,編譯器就會去檢查該方法是否真的重寫了父類的方法
//如果的確重寫了,編譯通過,如果沒有構成重寫則編譯錯誤
//4. 看看@Override的原始碼
//如果發現 @interface 表示 一個注解類
/*
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
*/
@Override
public void fly() {
System.out.println("Son fly....");
}
}
-
補充說明:@interface 的說明,@interface 不是介面,是注解類 是jdk1.5 之后加入的,
-
@Override 使用說明
-
@Override 表示是指定重寫父類的方法(從編譯層面驗證),如果父類沒有fly方法,或者沒有重寫方法,則會報錯;
-
如果不寫 @Override 注解,而父類仍有 public void fly(){},仍然構成重寫;
-
@Override 只能修飾方法,不能修飾其他類,包,屬性等等;
-
查看 @Override 注解原始碼@Target(ElementType.METHOD),說明只能修飾方法;
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { } -
@Target 是修飾注解阿注解,稱為元注解;
-
二、 @Deprecated 注解
@Deprecated:用于表示某個程式元素(類,方法等)已過時,
public class Deprecated_ {
public static void main(String[] args) {
A a = new A();
}
}
//1. @Deprecated 修飾某個元素,表示該元素已經過時了
//2. 即不再推薦使用,但是仍然可以使用
//3. 查看原始碼
/*
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value=https://www.cnblogs.com/zh-Note/p/{CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
*/
//4. 可以修飾方法,類,欄位,包,引數等等
//5. @Deprecated 可以做版本升級過渡使用
@Deprecated
class A{
public int n1;
public void hi(){}
}
- @Deprecate 使用說明
- 用于修飾某個程式元素,表示該元素已經過時了;
- 可以修飾方法,類,欄位,包,引數等等;
- @Target(value=https://www.cnblogs.com/zh-Note/p/{CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE});
- @Deprecated 的作用可以做到新舊版本的兼容和過渡;
三、 @SuppressWarnings 注解
@SuppressWarnings:抑制編譯器警告,
public class SuppressWarnings_ {
//1. 當我們不希望看到這些警告的時候,可以使用 @SuppressWarnings 注解來抑制警告資訊
//2. 在{""}中,可以寫入你希望抑制(不顯示警告資訊)
//3. 關于SuppressWarnings 作用范圍是和你放置的位置相關
// 比如@SuppressWarnings放置在 main方法,那么一致警告的范圍就是 main
// 通常我們可以放置具體大的陳述句,方法和類
//4. 看看 @SuppressWarnings 的原始碼
/*
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
*/
@SuppressWarnings({"rawtypes","unchecked","unused",})
public static void main(String[] args) {
List list = new ArrayList();
list.add("jack");
list.add("tom");
list.add("mary");
int i;
System.out.println(list.get(1));
}
}
-
使用說明
all 抑制所有警告 boxing 抑制裝箱、拆箱操作時候的警告 cast 抑制映射相關的警告 dep-ann 抑制啟用注釋的警告 deprecation 抑制過期方法警告 fallthrough 抑制在 switch 中缺失 breaks 的警告 finally 抑制 finally 模塊沒有回傳的警告 hiding 抑制相對于隱藏變數的區域變數的警告 incomplete-switch 忽略不完整的 switch 陳述句 nls 忽略非 nls 格式的字符 null 忽略對 null 的操作 rawtypes 使用 generics 時忽略沒有指定相應的型別 restriction 抑制禁止使用勸阻或禁止參考的警告 serial 忽略在 serializable 類中沒有宣告 serialVersionUID 變數 static-access 抑制不正確的靜態訪問方式警告 synthetic-access 抑制子類沒有按最優方法訪問內部類的警告 unchecked 抑制沒有進行型別檢查操作的警告 unqualified-field-access 抑制沒有權限訪問的域的警告 unused 抑制沒被使用過的代碼的警告 - @SuppressWarnings 可以修飾的程式元素為 TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,查看@Target,
- 生成@SuppressWarnings 時,不用背,直接idea中點擊左側的黃色提示,就可以選擇(注意可以選擇指定生成的位置),
四、JDK 的 元Annotation
- 基本介紹:用于修飾為其他的Annotation
- 元注解的種類
- @Retention:指定注解的作用范圍,三種作用范圍 SOURCE,CLASS,RUNTIME
- @Target:指定注解可以在哪些地方使用
- @Documented:指定該注解是否會在 javadoc 體現
- @Inherited:子類會繼承父類注解
① @Retention 注解
- 說明:只能用于修飾一個 Annotation 定義,用于指定該 Annotation 可以保留多長時間,@Retention 包含一個 RetentionPolicy 型別的成員變數,使用 @Retention 時必須為該 value 成員變數指定值,
- @Retention的三種值:
- RetentionPolicy.SOURCE:編譯器使用后,直接丟棄這種策略的注解
- RetentionPolicy.CLASS:編譯器將把注解記錄在class檔案中,當運行 Java程式時,JVM 不會保留注解,這是默認值,
- RetentionPolicy.RUNTIME:編譯器將把注解記錄在class檔案中,當運行 Java程式時,JVM 會保留注解,程式可以通過反射獲取該注解,

//以下為 @Retention 注解原始碼
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
/**
* Returns the retention policy.
* @return the retention policy
*/
RetentionPolicy value();
}
② @Target 注解
- 基本說明:用于修飾 Annotation 定義,用于指定被修飾的 Annotation 能用于修飾哪些元素,@Target 也包含一個名為 value 的成員變數
//以下為 @Target 注解原始碼
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
/**
* Returns an array of the kinds of elements an annotation type
* can be applied to.
* @return an array of the kinds of elements an annotation type
* can be applied to
*/
ElementType[] value();
}
//修飾的元素的型別
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE,
/** Field declaration (includes enum constants) */
FIELD,
/** Method declaration */
METHOD,
/** Formal parameter declaration */
PARAMETER,
/** Constructor declaration */
CONSTRUCTOR,
/** Local variable declaration */
LOCAL_VARIABLE,
/** Annotation type declaration */
ANNOTATION_TYPE,
/** Package declaration */
PACKAGE,
/**
* Type parameter declaration
*
* @since 1.8
*/
TYPE_PARAMETER,
/**
* Use of a type
*
* @since 1.8
*/
TYPE_USE
}
③ @Documented 注解
- 基本說明:用于指定被該元 Annotation 修飾的 Annotation 類將被 javadoc 工具提取成檔案,即在生成檔案時,可以看到該注解,
- 說明:定義為 @Documented 的注解必須設定 Retention 值為 RUNTIME,
//以下為 @Documented 注解原始碼
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
④ @Inherited 注解
基本說明:被他修飾的Annotation 將具有繼承性,如果某個類使用了 @Inherited 修飾的 Annotation,則子類將自動具有該注解,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/540495.html
標籤:Java
上一篇:day07-功能實作06
