1.注解定义
同 classs 和 interface 一样,注解也属于一种类型。它是在 Java SE 5.0 版本中开始引入的概念。
- 代码定义
public @interface TestAnnotation {
}
2.注解应用
@TestAnnotation
public class Test {
}
3.元注解
元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。元注解也是一张标签,但是它是一张特殊的标签,它的作用和目的就是给其他普通的标签进行解释说明的。元标签有 @Retention、@Documented、@Target、@Inherited、@Repeatable 5 种。
- @Retention
Retention 的英文意为保留期的意思。当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的的存活时间。例如:
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {//指定 TestAnnotation 可以在程序运行周期被获取到
}
- @Documented
作用是能够将注解中的元素包含到 Javadoc 中去
- @Target
@Target 指定了注解运用的地方。当一个注解被 @Target 注解时,这个注解就被限定了运用的场景
- @Inherited
Inherited 是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。例如:
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Test {}
@Test
public class A {}
public class B extends A {}
注解 Test 被 @Inherited 修饰,之后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解。
- @Repeatable
Repeatable 自然是可重复的意思。@Repeatable 是 Java 1.8 才加进来的,所以是一个新的特性。
什么样的注解会多次应用呢?通常是注解的值可以同时取多个。例如:
@interface Persons {
Person[] value();
}
@Repeatable(Persons.class)
@interface Person{
String role default "";
}
@Person(role="artist")
@Person(role="coder")
@Person(role="PM")
public class SuperMan{
}
//@Repeatable 注解了 Person。而 @Repeatable 后面括号中的类相当于一个容器注解。
4.注解的属性
注解的属性也叫作成员变量。注解只有成员变量,没有方法。注解的成员变量在注解的定义中以"无形参的方法"的形式来定义,其方法名定义了成员变量的名字,其返回值类型定义了成员变量的类型。例如:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
int id();
String msg();
}
//上面代码定义了 TestAnnotation 这个注解中拥有 id 和 msg 两个属性。在使用的时候,我们应该给它们//进行赋值。
//赋值的方式是在注解的括号内以 value=”” 形式,多个属性之前用 ,隔开。
@TestAnnotation(id=3,msg="hello annotation")
public class Test {
}