注解是什么
注解的定义
Java注解通过@interface
关键字定义
public @interface MyAnnotation {
}
那么注解到底是个什么东西呢?在日常生活中,往往会给关系要好的朋友起一个昵称或者绰号,比如说雷军,网络上尊称雷布斯,可以理解为雷布斯就是雷军的一个标签,并且雷布斯这个标签有特定的含义。那么注解在我们的java代码中就起到了一个标签的作用。
注解的属性
注解的属性也叫做成员变量。注解有且只有成员变量。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。但是在注解中定义属性时它的类型必须是 Java 基本数据类型、类、接口、注解及它们的数组。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
int id();
String info();
}
在使用注解时可以重复为注解属性赋新值,如下:
@MyAnnotation(id = 1,info = "hello annotation")
public class AnnoDemo {
}
注解属性可以有自己的默认值,使用default
关键字声明;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
int id() default 0;
String info() default "";
}
另外如果注解在声明时使用了value作为属性名称,应用这个注解时可以直接将属性值填写到括号内。
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Rename {
String value();
}
上面带有value属性的注解可以这样使用:
@MyAnnotation(id = 1,info = "hello annotation")
public class AnnoDemo {
@Rename("hello")
private String name;
}
元注解
在介绍注解属性的时候,我们已经开始使用了部分注解,比如@Target
、@Retention
,这些东西是什么呢?我们称之为元注解。
元注解是什么
元注解是一种特殊的注解,它能够应用到其它的普通注解上面,目的就是给其他普通的注解进行解释说明。
元注解的类型
@Retention:当一个普通注解被
@Retention
注解标识时,它限定了这个普通注解的生命周期。-
RetentionPolicy.SOURCE
: Java源码期起作用,编译期被丢弃; -
RetentionPolicy.CLASS
: 只在编译期起作用,单不会被加载到JVM中; -
RetentionPolicy.RUNTIME
: 它会被加载进入到JVM中,在Java程序运行的生命周期中都起作用;
-
@Target:当一个普通注解被
@Target
注解标识时,这个普通注解就被限定了在那些地方起作用。比如被限定只在java的类上起作用、或者方法上起作用。-
ElementType.TYPE
: 对注解、类、接口、枚举进行注解; -
ElementType.FIELD
: 对属性进行注解; -
ElementType.METHOD
: 对方法进行注解; -
ElementType.PARAMETER
: 对形参进行注解; -
ElementType.CONSTRUCTOR
: 对构造器进行注解; -
ElementType.LOCAL_VARIABLE
: 对局部变量进行注解; -
ElementType.ANNOTATION_TYPE
: 对注解进行注解; -
ElementType.PACKAGE
: 对一个包进行注解; -
ElementType.TYPE_PARAMETER
: 对引用类型参数注解(JDK1.8新增); -
ElementType.TYPE_USE
: 对类型进行注解(JDK1.8新增);
-
- @Documented: 说明该注解将被包含在javadoc中。
- @Inherited: 如果一个父类被
@Inherited
修饰过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了父类的注解。 - @Repeatable: 被
@Repeatable
修饰的注解可以重复使用。