目录
一、注解是什么?
二、注解的作用?
三、Java中的内置注解有哪些?
四、如何自定义一个注解?
五、JDK8中的新特性
注解就是一种可以标注在类、属性、方法、方法参数等结构上面的一种特殊“注释”,其实就可以看作是一种注释,这些注释信息可以生成文档、可以进行编译检查、可以在运行时获取到注释信息
1. 生成文档 类上面的作者、时间、简要信息等信息 方法上面的对方法进行上面 对方法参数、返回值进行说明
2. 编译检查,例如@Overide 可以检查方法是否是重写的方法
@Deprecated是标识方法已过时 @SuppressWarnings标明要忽略的警告 在编译是能够进行检查
3. 编译时动态处理:可以在编译时对代码的元数据信息进行动态处理,比如动态生成代码
4. 运行时动态处理:可以在运行时对代码的元数据信息进行动态处理,比如利用反射创建实例
一般需要结合反射使用才能发挥作用
1. Java自带的标准注解:
@Overide、@Deprecated是标识方法已过时、@SuppressWarnings标明要忽略的警告 编译的时候会对其进行检查
2. 元注解
@Target:标明注解能放置到那些位置上
@Target({ElementType.TYPE,ElementType.FIELD}) 可以声明的类型:
TYPE(类型,指的是类、接口、枚举)、FIELD(属性)、METHOD(方法)、PAR AMETER(参数)、CONSTRUCTOR(构造器)、LOCAL_VARIABLE(局部变量)、ANNOTATION_TYPE(注解类型)、PACKAGE(包)、TYPE_PARAMETER(类型 参数)、TYPE_USE(类型参数,更加广泛)
@Retention:标明注解的生命域
属性值是RententionPolicy类型的枚举值:SOURCE(表示只存在于源文件中,编译后的字节码中不存 在,并且不能通过反射获取到)、CLASS(表示在字节码中也存在了,但还是不能通过反射获取到),RUNTIME(表示可以通过反射获取到)
@Retention(RetentionPolicy.RUNTIME)
@Inherited元注解:加上其注解,表示其被修饰的注解可以被子类所继承
@Document元注解:表示在生成的文档中,能包含注解信息
1. 使用@Interface创建注解
2. 写好注解的元注解
3. 写好注解里面的属性:
注意如果只是一个value可以忽略,如果有多个参数的情况下,只有其他参数都有默认值的情况下,value才能进行忽略
类型也不是任意的类型都行的,类型只能时 八种基本数据类型及其对应的包装类型、String、Class、Enum 、注解类型及这些类型对应的数组类型
1. 可重复注解
就是可以在结构上面重复的写一个相同的注解,在jdk8之前需要使用注解数组的方式
1. 定义你要重复的那个注解:
@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value();
Status status() default Status.OK;
}
2. 构造一个注解表明你要重复 属性类型就是注解数组
@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
//因需要重复的注解而构造的s注解属性值必须是value
public @interface MyAnnotations {
MyAnnotation [] value();
}
3. 在之前你要重复的那个注解上面加上@Repeatable(value = MyAnnotations.class)元注解
@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(value = MyAnnotations.class)
public @interface MyAnnotation {
String value();
Status status() default Status.OK;
}
使用:
@MyAnnotation("abc")
@MyAnnotation("def")
public class MidStudent extends Student{
}
2. 类型注解
顾名思义就是在类型前面加上注解,用来 解释 类型
像这样:
public class School <@MyAnnotation1(value = "fa") T >{
public void dosome(T t){
//这种类型注解如果能使用,得在注解的Target元注解加上ElementType.TYPE_USE
@MyAnnotation1("da") String name = "";
}
}
使用的条件是在@Target注解中写好ElementType.TYPE_USE类型
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE})
@Inherited
@Documented
public @interface MyAnnotation1 {
String value();
}