Annotation 翻译过来就是注解、标注的意思,注解就是代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取并执行相应的处理。在工作学习中Java注解是一个很常用和实用的知识点。
因为在学习或者工作中使用注解的场景很多,但是去了解的却很少很少,注解同class类,interface接口一样,注解也属于一种类型。以下主要介绍Java的基本注解、自定义注解和元注解。
@Overried(重写注解)
重写注解:在子类重写父类方法时,方法上标记@Override注解表示重写父类方法,此注解只能在方法上标注。
@Deprecated(过时注解)
过时注解:通常用来标记过时的方法、类、字段等,可以使用,但是不建议使用,一般有更优的替代方案来替代它。
@SuppressWarnings(抑制编译器警告注解)
抑制编译器警告注解:可以使用这个注解来让编译器不给予代码警告。
@SafeVarargs
@SafeVarargs注解也是用来抑制编译器警告的注解,不过场景为发生堆污染时编译器会给予警告,可以通过这个注解让编译器不给予代码警告。堆污染:比如将不带泛型的集合赋值给带泛型的集合,这种情况就很容易发生堆污染。
@FunctionalInterface(函数式接口注解)
该注解只能标记在有且只有一个抽象方法的接口上,jdk8接口中的静态方法和default修饰的默认方法都不算抽象方法,加上此注解能够让编译器更好的检查错误。
Annotation通过@interface关键字进行定义:
public @interface TestAnnotation { }
如上就自定义了一个@TestAnnotation注解,可以看见跟修饰接口的关键字interface多了一个@符号。自定义注解可以有成员变量,成员变量只能是String、枚举、double等类型的变量。
将注解标注在类上、方法上或者字段上使用:
@TestAnnotation public class UserController {
@TestAnnotation
public String getUser(){
return "GET_USER";
}
}
当这样直接运行代码时会出现异常,所以需要Java的元注解来修饰描述注解:如下
JDK的元注解:
1)@Retention(只能用于修饰其它Annotation,用于指定被修饰的Annotation被保留时间)
@Retention注解有一个属性 value 为RetentionPolicy类型(枚举类型),RetentionPolicy枚举有三个值:SOURCE(编译)、CLASS(加载)、RUNTIME(运行)
2)@Target(只能用于修饰其它Annotation,用于执行被修饰的Annotation用于修饰那些程序单元)
@Target注解有一个属性value为ElementType类型的数组(枚举类型数组),ElementType枚举有:TYPE(类、接口、注解类型、枚举声明、自定义注解)、FIELD(属性、字段、枚举常量)、METHOD(方法)、CONSTRUCTOR(构造方法)、PARAMTER(参数)、LOCAL_VARIABLE(局部变量)、ANNOTATION_TYPE(注解类型)、PACKAGE(包)、TYPE_PARAMTER、TYPY_USE
3)@Documented(用于执行被该Annotation修饰的Annotation类将被javadoc工具提取成文档)
4)@Inherited(用于执行被修饰的Annotation类具有继承性)
当自定义一个注解并使用@Inherited注解修饰时,被自定义注解修饰的类被继承时,子类也自动有该自定义注解。
更多的注解详细使用就不写了。
原文:https://www.cnblogs.com/kjs-bk/p/14630069.html