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实例
  • 数据的接入,配置信息,然后展示,跟后端关系不大,可以独立上线
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章