1:注解的retention

通过retention,配合java.lang.annotation.RetentionPolicy,可以设置注解的生效范围,源码如下:

// 注解的保留策略。通过枚举对象描述了保留注解信息的不同此策略。这些枚举和java.lang.annotation.Retention元注解配合使用,来指定注解保留到哪个阶段
public enum RetentionPolicy {
    // 只在源代码中有注解信息,编译器编译后会丢弃注解信息
    SOURCE,

    // 编译器编译源代码后,会将注解信息保留在字节码中,但是JVM加载字节码后,会删除这些
    // 注解信息,即运行时无法获取注解信息,这也是注解保留的默认策略,这种方式可以通过注解处理器
    // javax.annotation.processing.Processor获取注解信息(SPI机制注册,javac识别处理)
    CLASS,

    // 编译器编译而成的字节码有该注解信息,JVM类加载器加载到JVM中后也有该注解信息,
    // 因此可以在运行时通过反射机制来获取注解信息
    RUNTIME
}

2:运行时获取注解信息

2.1:定义注解

@Retention(RetentionPolicy.RUNTIME) // 保留到运行时
@Target(ElementType.METHOD) // 用在方法上
@Documented // 通过JavaDoc生成文档
public @interface Get {

    String value() default "";
}

2.2:定义使用注解的类

public class AnnotationTest {

    @Get(value = "http://ip.taobao.com/59.108.54.37")
    public String getIpMsg() {
        return "";
    }

    @Get(value = "http://ip.taobao.com/")
    public String getIp() {
        return "";
    }
}

2.3:测试获取注解

public class AnnotationProcessor {

    public static void main(String[] args) {
        Method[] methods = AnnotationTest.class.getDeclaredMethods();
        for (Method m : methods) {
            Get get = m.getAnnotation(Get.class);
            System.out.println(get.value());
        }
    }
}

运行:

http://ip.taobao.com/
http://ip.taobao.com/59.108.54.37

3:编译时获取注解

暂略

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐