Java 注解

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公司
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值