上一篇博客介绍到注解的分类以及每一种注解的特点。这次来说说自定义注解。
在说注解之前先说说元注解。
元注解
元注解简单来说就是注解的注解。
在上一篇博客说到注解根据运行机制可以分为三种。那么我们自定义的注解是属于哪一种呢?其实可以属于任何一种。因为我们可以用元注解给我们自定义的注解标记到底是编译时注解还是运行时注解。
元注解主要有以下几种:
@Target
用来标注注解的作用域 ,用法: @Target({ElementType.METHOD,ElementType.TYPE}) 这个注解的作用是,被这个注解说标注的注解的作用域是类。接口或者方法。
@Target
的值可以传入一个或多个:@Target({ElementType.METHOD})和@Target({ElementType.METHOD,ElementType.TYPE}) 都是可以的,具体使用还看具体情况。@Target 的值可以取得值:
ElementType.METHOD 作用于方法声明
ElementType.TYPE 作用于类或方法声明
ElementType.CONSTRUCTOR 作用于构造方法声明
ElementType.FIELD 作用于字段声明
ElementType.PACKAGE 作用于包声明
ElementType.LOCAL_VARIABLE 作用于局部变量声明
ElementType.PARAMETER 作用于参数声明
@
Retention
用来标注注解的作用时机
用法:
@
Retention (RetentionPolicy.RUNTIME)
RetentionPolicy.SOURCE —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略
RetentionPolicy.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略
RetentionPolicy.RUNTIME —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用
RetentionPolicy.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略
RetentionPolicy.RUNTIME —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用
@Inherited 标示性注解运行子类继承 标记了此注解的注解只在被标记的子类有效。可能这句话比较难懂,假如有一个A自定义注解,A注解在定义的时候被标上了
@Inherited。而A注解又标注了B类,C类继承了B类。此时注解A的作用只作用于C类。
@Documented 在生成Javadoc时会包含注解
介绍了一些元注解。那么接下来我们来看自定义注解到底是怎样自定义的
自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface MyAnnotaion {
int age() default 20;
String name();
}
可以看到上面的自定义注解,是一个作用于方法声明的运行时注解
定义注解的格式就是
public @interface 注解名称{
}
然后再自定义的注解里面可以有注解成员。
然后再自定义的注解里面可以有注解成员。
注解成员的定义格式:String XXX();在定义注解成员的时候可以给注解成员一个默认值:int age() default 20。
要注意的是注解成员的类型只能是基本数据类型以及相应的数组,封装类,
String、Class、enums、注解类型。类似于List,Map是非法的。
而且定义的时候必须无参无异常。
下一篇博客将会说到如何解析自定义注解