Annotation 注解
基础
-
注解:放在Java源代码的类、方法、字段、参数前的一种特殊"注释";给计算看的。
-
从JVM的角度看,注解本身可以被编译器打包进入class文件,因此注解是"元数据"。可通过反射机制访问。
-
反编译看代码的本质:注解本质上是一个接口,该接口默认继承Annotation
public interface MyAnno extends java.lang.annotation.Annotation{}
-
作用分类:
- 编写文档:通过代码里的标识的元数据 生成文档【生成doc文档】
- 代码分析:通过代码里的标识的元数据 对代码进行分析【使用反射】
- 编译检查:通过代码里的标识的元数据 让编译器能够实现基本的编译检查【override】
自定义注解
- 方法名称就是参数名称;
- 返回值类型就是参数的类型;
- default声明参数默认值;
- 如果只有一个参数,一般参数名为value,使用是可省略参数只写值;
- 注解元素必须有值;
实例
/* 格式:
元注解
public @interface 注解名称{}
*/
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Interf {
int type() default 0;
int id() default -1; // -1,代表不存在
String value() default "info";
String[] arr() default {"a","b"};
}
// 使用
@Interf(id = 1, type = 2, arr = {"c","d"})
public class Test01(){
}
元注解
-
元注解:负责注解其它注解,Java提供4个meta-annotation类型,用于注解annotation类型;
- @Target:描述注解使用的范围
- @Retention:描述注解的生命周期(SOURCE 源代码 < CLASS < RUNTIME)
- @Document:该注解将包含在javadoc中
- @Inherited:子类可以继承父类中的该注解
-
支持在java.lang.annotation包中;
-
源码分析
-
@Target
// Target 需要一个参数ElementType[] @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target { /** * Returns an array of the kinds of elements an annotation type * can be applied to. * @return an array of the kinds of elements an annotation type * can be applied to */ ElementType[] value(); }
public enum ElementType { /** Class, interface (including annotation type), or enum declaration */ TYPE, /** Field declaration (includes enum constants) */ FIELD, /** Method declaration */ METHOD, /** Formal parameter declaration */ PARAMETER, /** Constructor declaration */ CONSTRUCTOR, // 构造器 /** Local variable declaration */ LOCAL_VARIABLE, /** Annotation type declaration */ ANNOTATION_TYPE, /** Package declaration */ PACKAGE, /** * Type parameter declaration * * @since 1.8 */ TYPE_PARAMETER, /** * Use of a type * * @since 1.8 */ TYPE_USE, /** * Module declaration. * * @since 9 */ MODULE }
-
@Retention
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention { /** * Returns the retention policy. * @return the retention policy */ RetentionPolicy value(); }
public enum RetentionPolicy { /** * Annotations are to be discarded by the compiler. */ SOURCE, /** * Annotations are to be recorded in the class file by the compiler * but need not be retained by the VM at run time. This is the default * behavior. */ CLASS, /** * Annotations are to be recorded in the class file by the compiler and * retained by the VM at run time, so they may be read reflectively. * * @see java.lang.reflect.AnnotatedElement */ RUNTIME }
-
@Document
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Documented { }
-
@Inherited
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Inherited { }
-
JDK 内置注解
包:java.lang.
@Override:检测被该注解标注的方法是否继承自父类(接口)的;
@Deprecated:该注解标注的内容,表示已过时,或有更好的方法;
@SuppressWarnings:压制警告
@SuppressWarnings("all")
@SuppressWarnings(valu={"uncheched","deprecation"})
javadoc 注解
- @author 作者名
- @version 版本号
- @since 指明需要最早使用的jdk版本
- @param 参数名
- @return 返回值情况
- @throws 异常抛出情况
/*
* 版权注解
* projectName:
* fileName:
* packageName:
* date:
* author:
* copyright(c) 2017-2020 xxx公司
*/