> 文档中心 > 【Java基础】注解

【Java基础】注解

文章目录

  • 1.简介
  • 2.注解语法
    • 2.1 注解接口
    • 2.2 注解格式及快捷方式
      • 2.2.1 注解格式
      • 2.2.2 快捷方式1:标记注解
      • 2.2.3 快捷方式2:单值注解
    • 2.3 注解的用法
  • 3.标准注解
    • 3.1 用于编译的注解
    • 3.2 用于管理资源的注释
    • 3.3 元注解

1.简介

  • 在Java中,注解被当作一个修饰符(public、static、protect…)来用的。
  • 它被置于被注解项之前,中间没有分号。
  • 注解可以注解类、方法、成员和局部变量,甚至是注解(后面会提到元注解,元注解可以用来注解注解)。
  • 每个注解都必须通过注解接口进行定义。
  • 注解本身不会做任何事情,它们只存在于源文件中,编译器将它们置于类文件中,并且虚拟机会将他们载入。
  • 所有的注解都隐式地扩展自java.lang.annotation.Annotation接口。
  • 一个项可以有多个注解。

2.注解语法

2.1 注解接口

首先我们知道注解是通过注解接口定义的,如下

public @interface Test{    //类型 元素名();    String elementName1();    int elementName2();}

其中elementName1();是注解中元素的声明方式。

注解元素的类型为以下之一:

  • 基本类型(int、short、long、byte、char、double、float或者boolean)
  • String
  • Class(具有一个可选类型的参数,例如Class<? extends MyClass)
  • enum类型
  • 注解类型
  • 由上述类型元素组成的数组

2.2 注解格式及快捷方式

首先我们先来说一下default的用法:

public @interface Test{    String elementName1() default value1;    int elementName2();}

这里的的default表示了注解被使用时,如果某个元素没有指定某个值,就会默认使用default后面的value。

注意:一个注解元素永远不能设置为null,甚至是默认值也不可以设置为null,所以你必须使用其他的默认值,例如 “” 或者 Void.class

2.2.1 注解格式

@AnnonationName(elementName1=value1, elementName2=value2)

这里元素的顺序无关紧要,下面我们来讲一下关于注解的快捷方式

2.2.2 快捷方式1:标记注解

如果一个注解中的元素没有指定值(注解中没有任何元素或者所有元素都是用默认值),那么你就可以省略括号,如下,7、8两行代码的效果是一样的。

public @interface Test{    String elementName1() default "[none]";    int elementName2() default 0;}@Test(element1="[none]", element2=0);@Test

2.2.3 快捷方式2:单值注解

如果一个元素具有特殊的名字value,并且没有指定其他的元素(简而言之就是这个注解只有一个元素),那么我们可以忽略掉这个元素名以及等号。上代码!

public @interface Test{    String elementName1() default "[none]";}@Test(elementName1="Tatakai!")@Test("Tatakai!")

在这里第五行和第六行的效果是一样的。

在这里如果元素值是一个数组,那么我们需要将值用 { } 括起来,像这样:

public @interface Test{    String[] elementName1();}@Test(elementName1={"one","two","three"})

如果这个数组只有一个值,那么可以写成这样:

@Test(elementName1={"one"})@Test(elementName1="one")

这两行的效果也是一样的。

2.3 注解的用法

注解可以出现在下列声明处:

  • 接口
  • 方法
  • 构造器
  • 实例域(包含enum常量)
  • 局部变量
  • 参数变量
  • 类型参数

对于类和接口,需要将注释放在class和interface关键词的前面:

@Entity public class User {...}

对于常量,需要将他们放在类型的前面:

@SuppressWarnings("uncheck")List<User> users = ...

接上,如果是泛型中的类型参数可以这样写:

public class Cache<@Immutable V> {...}

3.标准注解

标准注解是在java.lang、java.lang.annotation和javax.annotation包中由官方定义的注解。

3.1 用于编译的注解

注解接口 应用场合 目的
Deprecated 全部 将某项标记为过时的
SuppressWarnings 除了包和注解之外的所有情况 阻止某个给定类型的警告信息
Override 方法 检查该方法是是否覆盖了某个超类方法
Generated 全部 供代码生成工具来使用

3.2 用于管理资源的注释

注解接口 应用场合 目的
PostConstruct、PreDestroy 方法 被标记的方法应该在构造方法之后或者被移除之前立即被调用
Resource 类、接口、方法、域 在类或接口上:标记为在其他地方要用到的资源。在方法或域上:为“注入”而标记。

3.3 元注解

注解接口 应用场合 目的
Target 注解 指明这个注解可以用于哪些项
Retention 注解 指明这个注解可以保留多久
Document 注解 指明这个注解应该包含在注解项的文档中
Inherited 注解 指明当这个注解应用于一个类的时候,能够自动被他的子类继承