美文网首页
Java中的注解

Java中的注解

作者: iDevOps | 来源:发表于2019-09-16 15:34 被阅读0次
什么是注解
  • 注解也叫元数据,一种代码级别的说明。
  • 它是JDK1.5引入的一个新特性,与类、接口、枚举是在同一个层次。
  • 它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些数据进行说明。
注解分类
  • 编写文档,通过代码里标识的注解生成文档
/**
 * 注解文档演示
 *
 * @author SN
 * @version 1.0
 * @since 1.5
 */
public class AnnotationDoc {

    /**
     * 加法运算
     * @param a 整数
     * @param b 整数
     * @return 两数之和
     */
    public int add(int a, int b){
        return a+b;
    }

}
执行命令, 会生成Api文档
javadoc AnnotationDoc .class

正在加载源文件AnnotationDoc.java...
正在构造 Javadoc 信息...
标准 Doclet 版本 1.8.0_131
正在构建所有程序包和类的树...
正在生成.\com\test\annotation\AnnotationDoc.html...
正在生成.\com\test\annotation\package-frame.html...
正在生成.\com\test\annotation\package-summary.html...
正在生成.\com\test\annotation\package-tree.html...
正在生成.\constant-values.html...
正在构建所有程序包和类的索引...
正在生成.\overview-tree.html...
正在生成.\index-all.html...
正在生成.\deprecated-list.html...
正在构建所有类的索引...
正在生成.\allclasses-frame.html...
正在生成.\allclasses-noframe.html...
正在生成.\index.html...
正在生成.\help-doc.html...

Api文档
  • 代码分析,通过代码里标识的注解对代码进行分析(使用反射)
  • 编译检查,通过代码里标识的注解让编译器能够实现基本的编译检查(Override)
常见的JDK中预定义的注解

@Override : 检测被该注解标注的方法是否继承与父类(接口)
@Deprecated : 该注解标注的标识已经过时
@SuppressWarnings : 压制警告,例如 @SuppressWarnings("all")
等等....

自定义注解
  • 格式
public @interface 注解名称{
    属性列表;
}
  • 注解的本质

MyAnno.class

public @interface MyAnno {
}
1. 执行javac命令, MyAnno.java  --> MyAnno.class
javac MyAnno.class

2. 执行javap命令反编译MyAnno.class
javap MyAnno.class
Compiled from "MyAnno.java"
public interface MyAnno extends java.lang.annotation.Annotation {
}

得出结论: 注解本质上就是一个接口,该接口默认继承Annotation接口

  • 属性

返回值类型
基本数据类型、String、枚举、注解和以上类型的数组
属性值
1.如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
2.如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
3.数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略

# 自定义注解
public @interface MyAnno {
    int value();
    String name() default "lisi";
    String[] strs();
}
# 使用注解
@MyAnno(value = 1, strs = {})
public void test(){

}
  • 元注解

用于描述注解的注解

/**
 元注解:用于描述注解的注解
 * @Target:描述注解能够作用的位置
 *      ElementType取值:
 *          TYPE:可以作用于类上
 *          METHOD:可以作用于方法上
 *          FIELD:可以作用于成员变量上
 * @Retention:描述注解被保留的阶段
 *      @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
 * @Documented:描述注解是否被抽取到api文档中
 * @Inherited:描述注解是否被子类继承
 */
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnno {
    int value();
    String name() default "lisi";
    String[] strs();
}

相关文章

网友评论

      本文标题:Java中的注解

      本文链接:https://www.haomeiwen.com/subject/mpdxuctx.html