-
从JVM的角度看,注解本身可以被编译器打包进入class文件,因此注解是"元数据"。可通过反射机制访问。
-
反编译看代码的本质:注解本质上是一个接口,该接口默认继承Annotation
public interface MyAnno extends java.lang.annotation.Annotation{}
-
作用分类:
- 编写文档:通过代码里的标识的元数据 生成文档【生成doc文档】
- 代码分析:通过代码里的标识的元数据 对代码进行分析【使用反射】
- 编译检查:通过代码里的标识的元数据 让编译器能够实现基本的编译检查【override】
- 方法名称就是参数名称;
- 返回值类型就是参数的类型;
- default声明参数默认值;
- 如果只有一个参数,一般参数名为value,使用是可省略参数只写值;
- 注解元素必须有值;
实例
@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 { ElementType[] value(); }
public enum ElementType { TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, // 构造器 LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE, TYPE_PARAMETER, TYPE_USE, MODULE }
-
@Retention
@documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention { RetentionPolicy value(); }
public enum RetentionPolicy { SOURCE, CLASS, 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 { }
-
包:java.lang.
@Override:检测被该注解标注的方法是否继承自父类(接口)的; @Deprecated:该注解标注的内容,表示已过时,或有更好的方法; @SuppressWarnings:压制警告 @SuppressWarnings("all") @SuppressWarnings(valu={"uncheched","deprecation"})javadoc 注解
- @author 作者名
- @version 版本号
- @since 指明需要最早使用的jdk版本
- @param 参数名
- @return 返回值情况
- @throws 异常抛出情况
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)