Java注解经过@interface
关键字定义java
public @interface MyAnnotation { }
那么注解究竟是个什么东西呢?在平常生活中,每每会给关系要好的朋友起一个昵称或者绰号,好比说雷军,网络上尊称雷布斯,能够理解为雷布斯就是雷军的一个标签,而且雷布斯这个标签有特定的含义。那么注解在咱们的java代码中就起到了一个标签的做用。数组
注解的属性也叫作成员变量。注解有且只有成员变量。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。可是在注解中定义属性时它的类型必须是 Java 基本数据类型、类、接口、注解及它们的数组。网络
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { int id(); String info(); }
在使用注解时能够重复为注解属性赋新值,以下:code
@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
,这些东西是什么呢?咱们称之为元注解。get
元注解是一种特殊的注解,它可以应用到其它的普通注解上面,目的就是给其余普通的注解进行解释说明。源码
@Retention:当一个普通注解被@Retention
注解标识时,它限定了这个普通注解的生命周期。it
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新增);@Inherited
修饰过的注解进行注解的话,那么若是它的子类没有被任何注解应用的话,那么这个子类就继承了父类的注解。@Repeatable
修饰的注解能够重复使用。