补充java、javac和javadoc三者的区别
java:用来运行一个.class文件
javac:用来把.java文件编译为.class文件
javadoc:命令是用来生成自己API文档的。
// 打开cmd
javadoc 文档.java
(一)概念
注释:用文字描述程序的意思或功能,方便阅读程序,给程序员看的
注解:用来说明程序,给计算机看的,也叫元数据
格式:在需要添加注解的方法的上方 @注解名字
(二)注解的作用和分类
编写文档:通过代码里的标识元数据生成文档,如生成doc文档
代码分析:通过代码里面标识的元数据对代码进行分析,如使用反射
编译检查:通过代码里面标识的元数据让编译器能够实现基本的编译检查,如Override
(三)内置注解
Override:检查被改注解标注的方法是否是继承自父类(接口)的
Deprecated:将该注解标注的内容,标识已过时
SuppressWarnings:压制警告 一般传参all标识压制所有警告,一般写在类上,压制这个类的所有警告
(四)自定义注解
格式:public @interface 注解名{}
使用:@注解名称
本质:注解本质上就是一个接口,该接口默认继承Annotation接口
属性:“接口中可以定义的成员(抽象)方法”,因此在注解中,这些方法就是注解的属性。其属性有一下几个要求:
1、属性的返回值必须是基本数据类型 整形int String 枚举 注解 类型的 数组
2、定义了属性,在使用是需要给属性赋值
(1)如果很平常的定义一个属性,在使用注解的时候需要给初始值
(2)如果在定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值添加一个默认值。如(3)所用图中的 String name() default “ttt”; 所示
(3)如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略
(4)数组赋值比较特殊,值使用{}包裹,如果值只有一个,可以省略大括号
(5)枚举和注解定义属性的赋值
// Person枚举
public enum Person {
p1,p3
}
// MyAnno2注解
public @interface MyAnno2 {
}
// 定义注解
public @interface MyAnno {
枚举
Person per();
注解
MyAnno2 myno2();
}
// 使用注解
@MyAnno(per=Person.p1,myno2=@MyAnno2)
3、元注解:描述注解的注解,在定义注解的时候使用。比较常用的是@Target
(1)@Target:描述注解能过作用的位置,如在方法上使用,或者在属性上使用,若想即作用在类上,也作用在方法上,还可以作用在成员变量上,则需要将这三种都写上,用逗号隔开。其属性有:
TYPE: 可以作用于类上
METHOD: 可以作用于方法上
FIELD: 可以作用于成员变量上
(2)@Retention:描述注解被保留的阶段。自己定义注解一般会用RUNTIME。其属性有:
SOURCE: 当前被描述的注解,不会保留到class字节码文件中,也不会被JVM读取到
CLASS: 当前被描述的注解,会保留到class字节码文件中,不会被JVM读取到
RUNTIME: 当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
(3)@Documented:描述注解是否被抽取到api文档
(4)@Inherited:描述注解是否被子类继承
(五)在文档中使用注解
获取注解中定义的属性值(在一个使用了自定义注解的类中再在类中获取自定义注解的属性值)
1、获取注解定义的位置的对象(Class,Method,Field)
2、获取指定的注解getAnnotation(Class)
3、调用注解中的抽象方法获取配置的属性值