Java 注解基础

2022-07-18  本文已影响0人  Tinyspot

1. 注解(Annotation)

2. 内置注解

3. 元注解(meta-annotation)

3.1 @Target

public enum ElementType {
    TYPE,
    FIELD,
    METHOD,
    PARAMETER,
    CONSTRUCTOR,
    LOCAL_VARIABLE,
    ANNOTATION_TYPE,
    PACKAGE,
    TYPE_PARAMETER,
    TYPE_USE
}

3.2 @Retention

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    RetentionPolicy value();
}

public enum RetentionPolicy {
    // 保留在源码阶段,编译时被丢弃
    SOURCE,
    // 保留到编译进行时的class文件,但 JVM 加载class文件时候被遗弃
    CLASS,
    // 保留到程序运行时
    RUNTIME
}

3.3 @Documented

3.4 @Inherited

4. 自定义注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EntryLog {
  // 属性 value
  String value() default "";
  String[] codes() default {};
}

若属性没有默认值,必须给注解赋值

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EntryLog {
  String value() default "";
  String[] codes();
}
// 需给注解赋值
@EntryLog(codes = {"1001", "1002"})

4.1 注解属性类型

数组用 {} 来存储,当数组中只有一个值时可省略 {}

// 数组类型 String[] codes();
@EntryLog(codes = "1001")
@EntryLog(codes = {"1001", "1002"})

// 枚举数组类型  ElementType[] value();
@Target(ElementType.TYPE)
@Target({ElementType.TYPE, ElementType.METHOD})

4.2 反编译文件

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface EntryLog {
    int num() default 0;
    String value();
    // Class 类型
    Class<?> clazz();
    // 枚举类型
    CodeEnum codeEnum();
    // 注解类型
    DemoAnno demoAnno();
}
// 自动继承 java.lang.annotation.Annotation 接口
public interface EntryLog extends java.lang.annotation.Annotation {
  public abstract int num();
  public abstract java.lang.String value();
  public abstract java.lang.Class<?> clazz();
  public abstract com.example.concrete.CodeEnum codeEnum();
  public abstract com.example.concrete.DemoAnno demoAnno();
}
public interface Annotation {
  boolean equals(Object obj);
  int hashCode();
  String toString();
  Class<? extends Annotation> annotationType();
}

5. Spring 注解 @AliasFor

同一个注解中的两个属性互为别名
例如:@ComponentScan 注解中,value 和 basePackages 两个属性互为别名

public @interface ComponentScan {
    @AliasFor("basePackages")
    String[] value() default {};

    @AliasFor("value")
    String[] basePackages() default {};
}

跨注解的属性别名
例如:@Service#value的值可以映射到@Component#value

public @interface Service {
    @AliasFor(annotation = Component.class)
    String value() default "";
}
public @interface Component {
    String value() default "";
}

5.1 @SpringBootApplication 分析

public @interface SpringBootApplication {
    @AliasFor(annotation = EnableAutoConfiguration.class)
    Class<?>[] exclude() default {};

    @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
    String[] scanBasePackages() default {};
}

其他

上一篇 下一篇

猜你喜欢

热点阅读