最准确的解释是官方文档,最容易接受的解释是第三方作者翻译,最彻底的理解是撸源码
概述
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实例
- 数据的接入,配置信息,然后展示,跟后端关系不大,可以独立上线