【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 | 注解 | 指明当这个注解应用于一个类的时候,能够自动被他的子类继承 |