目录
1、初步了解
注解:说明程序的,给计算机看的
注释:用文字描述给程序员看的
定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用分类:
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】(生成API文档的)
② 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
2、基本内置注解
@Override
它的作用是对覆盖超类中方法的方法进行标记,如果被标记的方法并没有实际覆盖超类中的方法,则编译器会发出错误警告。
@Deprecated
标记方法过时了。
@SuppressWarnings("all") 压制警告class中有警告 加上这个注释就没了。
3、自定义注解
模仿jdk写一个
public @interface MyAnno {
}
测试:
public class Worker {
private String name ;
@MyAnno
public void show (){
}
}
可以使用但是没有作用。
将java文件编译成class,在反编译class得到
D:\work\IDEAworkspace\test\src\com\tungkong\anno>javac MyAnno.java
D:\work\IDEAworkspace\test\src\com\tungkong\anno>javap MyAnno.class
Compiled from "MyAnno.java"
public interface com.tungkong.anno.MyAnno extends java.lang.annotation.Annotation {
public abstract java.lang.String value();
}
发现 就是继承了一个java.lang.annotation.Annotation;注解的本质就是接口。是接口的话就可以在里面写方法。随便写一个方法
public @interface MyAnno {
String value() default "" ;
int age();
String name();
}
发现测试类Woker报错了,解决错误。
public class Worker {
private String name ;
@MyAnno(age = 1, name ="name1" )
public void show (){
}
}
得出结论:1、如果写了default 则表示设置默认值为" ",如果不写需要在使用注解的方法上写上值。2、注解类中的方法 就是show()注解的属性。
属性可以是1、基本数据类2、string类型3、枚举 4、数组 ,用{}表示
4、元注解
1.@Target注解:描述作用的位置
@Target(ElementType.TYPE) //作用在接口、类、枚举上
@Target(ElementType.FIELD) //作用在字段、枚举的常量上
@Target(ElementType.METHOD) //作用在方法上
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
//作用在类上 方法上 成员变量上
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
public @interface MyAnno {
String value() default "" ;
int age();
String name();
}
@MyAnno(age = 1, name = "name1")
public class Worker {
@MyAnno(age = 2, name ="2" )
private String name ;
@MyAnno(age = 1, name ="name1" )
public void show (){
}
}
2.@Retention 注解
用于描述注解的生命周期,表示需要在什么级别保存该注解,即保留的时间长短。
RetentionPolicy.SOURCE//注解仅存在于源码中,在class字节码文件中不包含
RetentionPolicy.CLASS // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
RetentionPolicy.RUNTIME // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
自定义一般用@Retention(RetentionPolicy.RUNTIME)
3.@Document注解
@Document 注解,说明该注解将被包含在javadoc中。它是一个标记注解,会添加API文档中
4.@Inherited 注解
@Inherited 注解,用于表示某个被标注的类型是被继承的。如果父类被 @Inherited 注解修饰,说明子类可以继承父类中的该注解。