最準確的解釋是官方文檔,最容易接受的解釋是第三方作者翻譯,最徹底的理解是擼源碼
概述
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文件中,或者是在運行時可以通過反射訪問。
RetentionPolicy.SOURCE
– 表明只在源碼中生效,編譯時會忽略掉,比如loombokRetentionPolicy.CLASS
– 在編譯期生效,但是會被JVM實例無視(運行)RetentionPolicy.RUNTIME
- 被jvm保留,運行時有效
-
@Documented
- 標記這些註解是否包含在用戶文檔中。 -
@Target
- 標記這個註解應該是哪種 Java 成員。
ElementType.ANNOTATION_TYPE
應當標註在註解上ElementType.CONSTRUCTOR
被標註在構造器上ElementType.FIELD
被標記在field或property.ElementType.LOCAL_VARIABLE
被標記在local_variable局部變量ElementType.METHOD
被標註在方法上ElementType.PACKAGE
被標註在包的聲明上ElementType.PARAMETER
被標記在方法的參數上ElementType.TYPE
被標記在方法的類型上
@Inherited
- 標記這個註解是繼承於哪個註解類(默認 註解並沒有繼承於任何子類即職位flase)。傳遞註解,a類有了該註解,子類或者實現類也會有該註解@Repeatable
- Java 8 開始支持,標識某註解可以在同一個聲明上使用多次。
源碼解析
源碼比較簡單
用途
編譯檢查
反射:反射中有很多輔助類來處理Annotation
- 1 個 Annotation 和 1 個 RetentionPolicy 關聯。
可以理解爲:每1個Annotation對象,都會有唯一的RetentionPolicy屬性。
2. 1 個 Annotation 和 1~n 個 ElementType 關聯。
可以理解爲:對於每 1 個 Annotation 對象,可以有若干個 ElementType 屬性。
- 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實例
- 數據的接入,配置信息,然後展示,跟後端關係不大,可以獨立上線