注解
自定义注解是我们开发和框架中必不可少的知识,作为一个高级开发者必备的技能。今天让我们深入了解下注解:
一个注解大致可以分为三个部分:注解体、元注解、注解属性
注解体
注解体是最简单的一个组成部分,只需要实例中一样有样学样即可。与接口的声明唯一的不同是在 interface 关键字前多了一个 @ 符号。
//声明了一个名为hello的注解体
@Retention(RetentionPolicy.RUNTIME)
public @interface hello{
}
元注解
元注解(meta-annotation)本身也是一个注解,用来标记普通注解的存留时间、使用场景、继承属性、文档生成信息。
元注解是一个特殊的注解,它是 Java 源码中就自带的注解。在Java 中只有四个元注解,它们分别是:@Target
、@Retention
、@Documented
、@Inherited
。
@Target注解
Target 注解限定了该注解的使用场景。
它有下面这些取值:
ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
ElementType.CONSTRUCTOR 可以给构造方法进行注解
ElementType.FIELD 可以给属性进行注解
ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
ElementType.METHOD 可以给方法进行注解
ElementType.PACKAGE 可以给一个包进行注解
ElementType.PARAMETER 可以给一个方法内的参数进行注解
ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
@Retention注解
Retention 注解用来标记这个注解的留存时间。
它其有三个可选值:
RetentionPolicy.SOURCE。注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
RetentionPolicy.CLASS。注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
RetentionPolicy.RUNTIME。注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
@Documented
@ Documented 注解表示将注解信息写入到 javadoc 文档中。
在默认情况下,我们的注解信息是不会写入到 Javadoc 文档中的。但如果该注解有 @Documented 标识,那么该注解信息则会写入到 javadoc 文档中。
@Inherited
@ Inherited注解标识子类将继承父类的注解属性。
在下面的例子中,我们声明了一个 Sweet 注解,接着在 Peach 类使用了 @Sweet 注解,但是并没有在 RedPeach 类使用该注解。
举个栗子:一个日志注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SystemLog {
/**
* 操作内容
*/
String value() default "";
/**
* 模块名
*/
String moduleName() default "";
/**
* 操作类型
*/
int operateType() default 0;
}
注解可以通过Aop去配置注解的行为,让注解简单并作用最大化。