java 注解

发布时间 2023-05-24 17:08:56作者: 黄光跃

java 内置注解

注解 作用 描述
@Override 将覆盖父类中的方法 作用在子类的方法上
@Deprecated 代码被弃用 使用了被@Deprecated注解的代码则编译器将发出警告
@SuppressWarnings 关闭编译器警告信息 取值为String[],警告信息是多种的,可以具体指明哪些类型的警告信息被抑制

@SuppressWarnings 取值范围如下

all,抑制所有警告
boxing,抑制与封装/拆装作业相关的警告
cast,抑制与强制转型作业相关的警告
dep-ann,抑制与淘汰注释相关的警告
deprecation,抑制与淘汰的相关警告
fallthrough,抑制与switch陈述式中遗漏break相关的警告
finally,抑制与未传回finally区块相关的警告
hiding,抑制与隐藏变数的区域变数相关的警告
incomplete-switch,抑制与switch陈述式(enum case)中遗漏项目相关的警告
javadoc,抑制与javadoc相关的警告
nls,抑制与非nls字串文字相关的警告
null,抑制与空值分析相关的警告
rawtypes,抑制与使用raw类型相关的警告
resource,抑制与使用Closeable类型的资源相关的警告
restriction,抑制与使用不建议或禁止参照相关的警告
serial,抑制与可序列化的类别遗漏serialVersionUID栏位相关的警告
static-access,抑制与静态存取不正确相关的警告
static-method,抑制与可能宣告为static的方法相关的警告
super,抑制与置换方法相关但不含super呼叫的警告
synthetic-access,抑制与内部类别的存取未最佳化相关的警告
sync-override,抑制因为置换同步方法而遗漏同步化的警告
unchecked,抑制与未检查的作业相关的警告
unqualified-field-access,抑制与栏位存取不合格相关的警告
unused,抑制与未用的程式码及停用的程式码相关的警告

元注解

标注注解的注解,约束定义的注解用在字段、方法还是类上;保留在编译期、运行期还是源文件上等
在JDK 1.5中提供了4个标准的元注解:@Target@Retention@Documented@Inherited, 在JDK 1.8中提供了两个元注解 @Repeatable@Native

@Target

作用是标明该注解可以用在什么地方

public enum ElementType {
    TYPE, // 类、接口、枚举类
    FIELD, // 成员变量(包括:枚举常量)
    METHOD, // 成员方法
    PARAMETER, // 方法参数
    CONSTRUCTOR, // 构造方法
    LOCAL_VARIABLE, // 局部变量
    ANNOTATION_TYPE, // 注解类
    PACKAGE, // 可用于修饰:包
    TYPE_PARAMETER, // 类型参数,JDK 1.8 新增
    TYPE_USE // 使用类型的任何地方,JDK 1.8 新增
}

@Retention

作用是指定注解的生命周期
lombok 的注解生命周期就是 RetentionPolicy.SOURCE
如果 反射 时需要获取到注解信息需要是 RetentionPolicy.RUNTIME,这是自定义注解的绝大部分场景

public enum RetentionPolicy {
    SOURCE,    // 源文件保留(java 文件)
    CLASS,       // 编译期保留,默认值(class 文件)
    RUNTIME   // 运行期保留(运行时也存在)
}

@Inherited

子类是否继承父类的注解,比如父类使用了 @Inherited 修饰的注解,子类会自动继承注解

自定义注解

@Target(value = {ElementType.METHOD})// 使用范围:方法
@Retention(RetentionPolicy.RUNTIME)// 作用域:运行时有效
@Documented // 可以被抽取到API文档中
@Inherited // 可以被子类继承。
@interface MyAnnotation {
    // 注解的参数:参数类型 + 参数名();
    String name() default "";// 需要输入一个String类型,不输入默认空字符串。
    int age() default 0;// 需要输入一个int类型,不输入默认0。
    int id() default -1;// 默认值-1,代表不存在。
    String[] schools();// 需要一个String类型数组
}

lombok @Data

RetentionPolicy.SOURCE 编译后的 class 中没有注解,并且反射也拿不到 @data 注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Data {
    String staticConstructor() default "";
}

springmvc @RestController

标注了 @Controller 和 @ResponseBody

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

spring @SpringbootApplication

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
// 可以作为配置类,这个注解上有 @Configuration
@SpringBootConfiguration 
// 开启自动配置
@EnableAutoConfiguration
// 扫描规则
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication{}