b java註解 Annotation介紹

—> go to 總目錄

最準確的解釋是官方文檔,最容易接受的解釋是第三方作者翻譯,最徹底的理解是擼源碼

概述

Java 註解(Annotation)又稱 Java 標註,是 JDK5.0 引入的一種註釋機制。
Java 語言中的類、方法、變量、參數和包等都可以被標註。和 Javadoc 不同,Java 標註可以通過反射獲取標註內容。在編譯器生成類文件時,標註可以被嵌入到字節碼中。Java 虛擬機可以保留標註內容,在運行時可以獲取到標註內容 。 當然它也支持自定義 Java 標註。

基礎

使用Annotation

註解的樣式 @Override

  • 標註在方法上
@Override
void mySuperMethod() { ... }
  • 標註在類上
@Author(
   name = "Benjamin Franklin",
   date = "3/27/2003"
)
class MyClass() { ... }
  • 創建實例時
 new @Interned MyObject();
  • 類型轉化
myString = (@NonNull String) str;
  • 定義類的實現
class UnmodifiableList<T> implements
        @Readonly List<@Readonly T> { ... }
  • 拋出異常
Thrown exception declaration:
    void monitorTemperature() throws
        @Critical TemperatureException { ... }

定義Annotation

假如要給如下的類附加版本信息:說明軟件版本的類

public class Generation3List extends Generation2List {
   // Author: John Doe
   // Date: 3/17/2002
   // Current revision: 6
   // Last modified: 4/12/2004
   // By: Jane Doe
   // Reviewers: Alice, Bill, Cindy

   // class code goes here

}

註解格式如下

@interface ClassPreamble {
   String author();
   String date();
   int currentRevision() default 1;
   String lastModified() default "N/A";
   String lastModifiedBy() default "N/A";
   // Note use of array
   String[] reviewers();
}

定義的註解可以賦值

@ClassPreamble (
   author = "John Doe",
   date = "3/17/2002",
   currentRevision = 6,
   lastModified = "4/12/2004",
   lastModifiedBy = "Jane Doe",
   // Note array notation
   reviewers = {"Alice", "Bob", "Cindy"}
)
public class Generation3List extends Generation2List {
// class code goes here
}

假如想要讓註解最終出現在文檔裏,還需要配合@Documented

@Documented
@interface ClassPreamble {
   // Annotation element definitions
}

內置Annotation類型

Java 定義了一套註解,共有7個,3個在java.lang中,剩下4個在java.lang.annotation 中。

作用在代碼上

  • @Deprecated
    標記過時方法。如果使用該方法,會報編譯警告。如果一個類不被使用了,那麼應該也在文檔中體現,如下
    /**
     * @deprecated
     * explanation of why it was deprecated
     */
    @Deprecated
    static void deprecatedMethod() { }
  • @Override
    檢查該方法是否是重載方法。如果發現其父類,或者是引用的接口中並沒有該方法時,會報編譯錯誤。

  • @SuppressWarnings
    指示編譯器去忽略註解中聲明的警告

   // use a deprecated method and tell 
   // compiler not to generate a warning
    //忽略掉 unchecked和 deprecation類型的告警
    @SuppressWarnings("deprecation","unchecked")
    void useDeprecatedMethod() {
        // deprecation warning
        // - suppressed
        objectOne.deprecatedMethod();
    }

從 Java 7 開始,額外添加了 3 個註解:

  • @SafeVarargs - Java 7 開始支持,忽略任何使用參數爲泛型變量的方法或構造函數調用產生的警告。
  • @FunctionalInterface - Java 8 開始支持,標識一個匿名函數或函數式接口。

元註解:

作用在其他註解上的註解

  • @Retention - 標識這個註解怎麼保存,是隻在代碼中,還是編入class文件中,或者是在運行時可以通過反射訪問。
  1. RetentionPolicy.SOURCE – 表明只在源碼中生效,編譯時會忽略掉,比如loombok
  2. RetentionPolicy.CLASS – 在編譯期生效,但是會被JVM實例無視(運行)
  3. RetentionPolicy.RUNTIME - 被jvm保留,運行時有效
  • @Documented - 標記這些註解是否包含在用戶文檔中。

  • @Target - 標記這個註解應該是哪種 Java 成員。

  1. ElementType.ANNOTATION_TYPE 應當標註在註解上
  2. ElementType.CONSTRUCTOR 被標註在構造器上
  3. ElementType.FIELD 被標記在field或property.
  4. ElementType.LOCAL_VARIABLE 被標記在local_variable局部變量
  5. ElementType.METHOD 被標註在方法上
  6. ElementType.PACKAGE 被標註在包的聲明上
  7. ElementType.PARAMETER 被標記在方法的參數上
  8. ElementType.TYPE 被標記在方法的類型上
  • @Inherited - 標記這個註解是繼承於哪個註解類(默認 註解並沒有繼承於任何子類即職位flase)。傳遞註解,a類有了該註解,子類或者實現類也會有該註解
  • @Repeatable - Java 8 開始支持,標識某註解可以在同一個聲明上使用多次。

源碼解析

源碼比較簡單
在這裏插入圖片描述

用途

編譯檢查
反射:反射中有很多輔助類來處理Annotation

  1. 1 個 Annotation 和 1 個 RetentionPolicy 關聯。

可以理解爲:每1個Annotation對象,都會有唯一的RetentionPolicy屬性。
2. 1 個 Annotation 和 1~n 個 ElementType 關聯。

可以理解爲:對於每 1 個 Annotation 對象,可以有若干個 ElementType 屬性。

  1. Annotation 有許多實現類,包括:Deprecated, Documented, Inherited, Override 等等。

參考

1 官方文檔 : https://docs.oracle.com/javase/tutorial/java/annotations/repeating.html
2 中文文檔 :
https://www.runoob.com/w3cnote/java-annotation.html

微服務監控的3個特性

  • 總覽頁面的環比+添加一個jvm GC瞬時值展示+空部署實例的展示
  • 環比
  • 四個框圖添加一個和昨天同一時段的比較
  • 三張圖添加一個曲線也是昨天同一時段的數據
    主要是前端複用之前的接口,該下時間區間
  • GC瞬時值(累計值和瞬時值)
  • 之前是累計值:jvm實例,會有GC停頓來定期回收內存,會有耗時和次數的統計。
    之前是累計值-應用啓動一直到目前的累計次數
  • 瞬時值就是一個時間段的次數統計
    目前走的是prometheus的接口,這裏主要改一下prometheus查詢接口的表達式
  • 空部署實例
  • 背景,虛機部署用的,iam那邊的服務是物理機部署,不是容器,所以那些實例iD沒法展示,監控頁面的一些功能不能用
  • bms的接口,sdk會生成實例id,不是bap實例
  • 數據的接入,配置信息,然後展示,跟後端關係不大,可以獨立上線
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章