注解的概念
注解(Annotation)又叫做标注,是Java5之后开始增加的一种引用数据类型。注解本质上是代码中的一种特殊标记,通过这些标记可以在编译、类加载、运行阶段进行相应的处理。
注解的使用
注解的定义如下:
访问修饰符 @interface 自定义注解名称{
注解成员
}
(1)自定义注解自动继承java.lang.annotation.Annotation接口。
(2)通过注解可以修饰包、类、接口、构造方法、成员方法、成员变量、参数,局部变量的声明。
注解的使用方法:
(1)注解中只有成员变量没有成员方法,成员变量通过"无参的方法"来声明,其方法名定义了该成员变量的名称,返回值定义类成员变量的类型。
//定义名为Person的注解
public @interface Person{
int value();//此处的无参方法的形式表示int类型名为成员变量
}
在使用没有给成员变量赋初始值的注解时,需要在注解中输入初始值
public class AnnotationTest {
//给AnnotationTest类中的show方法提供Person注解
@Person(value = "1") //给成员变量赋初始值
public static void show(){
}
}
也可以在注解声明时给予成员变量一个默认的值,则使用该注解时可以不对成员变量赋值。修改Person注解如下:
//定义名为Person的注解
public @interface Person{
int value() default 1;//给成员变量赋初始值
}
此时可以不对成员变量赋值,直接使用注解
public class AnnotationTest {
@Person //给AnnotationTest类中的show方法提供Person注解
public static void show(){
}
}
(2)如果注解只有一个成员变量,则建议起名为value,且成员变量的类型只能是八种基本数据类型,Class类型,String类型,Enum类型,Annotation类型。
元注解
元注解的基本概念
(1)元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。
(2)元注解主要有:@Retention,@Documented,@Target,@Inherited,@Repeatable
元注解一:@Retention
该元注解应用于一个注解用于说明该注解的生命周期,其成员变量的取值可以有如下三种:
(1)RetentionPolicy.SOURCE :表示修饰的注解只能保留在源码阶段,在编译器进行编译阶段时它将被丢弃。
(2)RetentionPolicy.CLASS:表示修饰的注解经过编译阶段后可以被保留在.Class字节码文件中,但并不会被加载进JVM中,且这是默认的方法。
(3)RetentionPolicy.RUNTIME:表示修饰的注解将被保留至运行阶段,将被加载进JVM中,在程序运行时可以被获取到。
简单使用如下:
//使用@Retention修饰Person注解,使其可以可存在于运行阶段
@Retention(RetentionPolicy.RUNTIME)
public @interface Person {
int value() default 1;
}
元注解二:@Documented
(1)@Documented注解应用于一个注解时,该注解可以被javadoc工具提取并在文档中显示。 使用javadoc工具可以从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档,而该工具抽取时默认不包括注解内容。
(2)定义为Documented的注解必须设置Retention的值为RUNTIME。
简单使用如下:
@Documented //使用@Documented注解使Person注解可被提取为文档
//使用@Retention修饰Person注解,使其可以可存在于运行阶段
@Retention(RetentionPolicy.RUNTIME)
public @interface Person {
int value() default 1;
}
通过javadoc工具提取AnnotationTest类的文档后,在文档中可以发现Person注解的存在,如图

元注解三:@Target
@Target用于指定被修饰的注解能用于哪些元素的修饰,取值如下:
| 变量取值 | 可注解类型 |
|---|---|
| ElementType.ANNOTATION_TYPE | 可以给一个注解进行注解 |
| ElementType.CONSTRUCTOR | 可以给构造方法进行注解 |
| ElementType.FIELD | 可以给属性进行注解 |
| ElementType.LOCAL_VARIABLE | 可以给局部变量进行注解 |
| ElementType.METHOD | 可以给方法进行注解 |
| ElementType.PACKAGE | 可以给一个包进行注解 |
| ElementType.PARAMETER | 可以给一个方法内的参数进行注解 |
| ElementType.TYPE | 可以给类型进行注解,比如类、接口、枚举 |
从Java8开始对元注解@Target的参数类型ElementType枚举值增加了两个
| 变量取值 | 可注解类型 |
|---|---|
| ElementType.TYPE_PARAMETER | 表示该注解能写在类型变量的声明语句中,如:泛型 |
| ElementType.TYPE_USE | 表示该注解能写在使用类型的任何语句 |
使Person注解只可以修饰方法
//Person注解只能修饰方法
@Target(ElementType.METHOD)
//使用@Documented注解使Person注解可被提取为文档
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Person {
int value() default 1;
}
此时用Person注解修饰AnnotationTest类时,则会报出无法修饰TYPE类型的错误。
元注解四:@Inherited
@Inherited并不是说注解本身可以继承,而是说如果一个超(父)类被该注解标记过的注解进行注解时,如果子类没有被任何注解应用时,则子类就继承超(父)类的注解。
元注解五:@Repeatable
@Repeatable表示自然可重复的含义,从Java8开始增加的新特性。
如果想对show方法作两次变量值不同的注解,则使用两次Person注解将会报错
public class AnnotationTest {
@Person(1) //将会报错
@Person(2)
public static void show(){
}
}
(1)在Java8之前通过声明一个新注解Persons,其成员变量的类型为Person数组来解决。
public @interface Persons {
Person[] value();
}
public class AnnotationTest {
@Persons({@Person(1),@Person(2)})
public static void show(){
}
}
这样就达到了使用两次注解的目的
(2)使用@Repeatable注解的方式解决
//使用Repeatable注解,参数需要是class的对象
@Repeatable(Persons.class)
@Target({ElementType.METHOD,ElementType.TYPE_USE})
//使用@Documented注解使Person注解可被提取为文档
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Person {
int value() default 1;
}
而且此时Persons的生命周期、目标注解类型需要和Person相同
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE_USE})
public @interface Persons {
Person[] value();
}
此时再进行重复的注解将没有问题
public class AnnotationTest {
@Person(1)
@Person(2)
public static void show(){
}
}
预制注解
• 预制注解就是Java语言自身提供的注解,具体如下
| 注解名称 | 功能 |
|---|---|
| @author | 标明开发该类模块的作者,多个作者之间使用,分割 |
| @version | 标明该类模块的版本 |
| @see | 参考转向,也就是相关主题 |
| @since | 从哪个版本开始增加的 |
| @param | 对方法中某参数的说明,如果没有参数就不能写 |
| @return | 对方法返回值的说明,如果方法的返回值类型是void就 |
| 不能写 | |
| @exception | 对方法可能抛出的异常进行说明 |
| @Override | 限定重写父类方法, 该注解只能用于方法 |
| @Deprecated | 用于表示所修饰的元素(类, 方法等)已过时 |
| @SuppressWarnings | 抑制编译器警告 |
本文详细介绍了Java注解的定义、使用方法、元注解以及预制注解。注解用于在编译、类加载和运行时进行处理,可以通过@Retention、@Documented、@Target、@Inherited和@Repeatable等元注解定制其行为。同时,文章列举了Java中常见的预制注解,如@author、@version等,并展示了如何自定义注解和处理重复注解。





