Java註解Annotaton

尤所不同發表於2022-05-17

1、三種基本的Annotaton

@Override : 限定某個方法,是重寫父類方法 , 該註解只能用於方法
@Deprecated : 用於表示某個程式元素 ( 類 , 方法等 ) 已過時
@SuppressWarnings : 抑制編譯器警告

@Override

class father{
   public void fly(){}
}
class son extends father{
    @Override
    public void fly() {
        super.fly();
    }
}

解讀

@Override表示son重寫了fly方法

細節

  1. 如果沒有@Override還是會重寫fly方法
class father{
   public void fly(){}
}
class son extends father{
    public void fly() {
        super.fly();
    }
}
  1. 寫了@Override註解,編譯器就會去檢查方法是否重寫了父類方法,如果重寫了,則編譯通過。若沒有重寫,則編譯錯誤。
    image

  2. @Override只能修飾方法,不能修飾其他類,包,屬性等等

//@Override底層程式碼
@Target(ElementType.METHOD)//ElementType.METHOD說明@Override只能修飾方法
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

@Deprecated

public class Deprecatedtext {
    public static void main(String[] args) {
        father father1 = new father();
        father1.fly();
    }
}
@Deprecated
class father{
    @Deprecated
   public void fly(){}
}

解讀

@Deprecated表示某個程式元素(類,方法等)已過時,會通過單詞中間的橫線提醒。表示不建議使用。

效果

image

細節

  1. 可以修飾方法,類,包,引數等等
//@Deprecated底層程式碼
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})//說明Deprecated能修飾方法,類,包,引數等等
public @interface Deprecated {
}
  1. @Deprecated的作用可以起到做新舊版本的相容過渡

@SuppressWarnings

@SuppressWarnings("all")
class father{
   public void fly(){}
}

解讀

@SuppressWarnings註解可以用來抑制警告資訊{""}寫入你希望抑制的警告資訊

效果

image
image

細節

1.@SuppressWarnings作用範圍和你放置的位置相關

public class Enumtext {
    @SuppressWarnings("all")//作用範圍在main方法
    public static void main(String[] args) {
        father father1 = new father();
        father1.fly();
    }
}
@SuppressWarnings("all")//作用範圍在father類
class father{
   public void fly(){}
}
  1. 指定警告型別有

    all,抑制所有警告
    boxing,抑制與封裝/拆裝作業相關的警告
    cast,抑制與強制轉型作業相關的警告
    dep-ann,抑制與淘汰註釋相關的警告
    deprecation,抑制與淘汰的相關警告
    fallthrough,抑制與switch陳述式中遺漏break相關的警告
    finally,抑制與未傳回finally區塊相關的警告
    hiding,抑制與隱藏變數的區域變數相關的警告
    incomplete-switch,抑制與switch陳述式(enum case)中遺漏專案相關的警告
    javadoc,抑制與javadoc相關的警告
    nls,抑制與非nls字串文字相關的警告
    null,抑制與空值分析相關的警告
    rawtypes,抑制與使用raw型別相關的警告
    resource,抑制與使用Closeable型別的資源相關的警告
    restriction,抑制與使用不建議或禁止參照相關的警告
    serial,抑制與可序列化的類別遺漏serialVersionUID欄位相關的警告
    static-access,抑制與靜態存取不正確相關的警告
    static-method,抑制與可能宣告為static的方法相關的警告
    super,抑制與置換方法相關但不含super呼叫的警告
    synthetic-access,抑制與內部類別的存取未最佳化相關的警告
    sync-override,抑制因為置換同步方法而遺漏同步化的警告
    unchecked,抑制與未檢查的作業相關的警告
    unqualified-field-access,抑制與欄位存取不合格相關的警告
    unused,抑制與未用的程式碼及停用的程式碼相關的警告
    image

元註解

  1. Retention 指定註解的作用範圍,三種SOURCE,CLASS,RUNTIME
  2. Target 指定註解可以在哪些地方使用
  3. Documented 指定該註解是否會在javadoc體現
  4. Inherited 子類會繼承父類註解

Retention

Retention的三種值

  1. RetentionPolicy.SOURCE :編譯器使用後,直接丟棄註釋
  2. RetentionPolicy.CLASS: 編譯器把註解記錄在class檔案中,當執行java時JVM不會保留註釋
  3. RetentionPolicy.PUNTIME:編譯器把註解記錄在class檔案中,當執行java時JVM保留註釋

Retention案例

@Override底層(IDEA進入底層的快捷鍵為Ctrl+B

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)//表示@Override在編譯器使用後,直接丟棄註釋
public @interface Override {
}

Target

Target的值

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

Target案例

@Deprecated底層

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})//表示@Documented在這些地方可以寫註解
public @interface Deprecated {
}

Documented

Documented案例

@Deprecated底層

@Documented//@Deprecated程式碼會被儲存到生產的文件中
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

Inherited

被它修飾的Annotation將具有繼承性,如果某個類使用了被@Inherited修飾的Annotation,則其子類將自動具有該註解