Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 

README.md

Annotation (java.lang.annotation.Annotation)

Design

Annotation 不会自己生效,必须由开发者提供相应的代码来提取并处理 Annotation 信息。 处理提取和处理 Annotation 的代码统称为 APT(Annotation Processing Tool)。

创建

@interface
public @interface TestAnnotation {
}

实现

Java 使用了动态代理对我们定义的注解接口生成了一个代理类。
反射比较慢,所以注解使用时也需要谨慎计较时间成本。

提取

首先可以通过 Class 对象的 isAnnotationPresent() 方法判断它是否应用了某个注解。 然后通过 getAnnotation() 方法来获取 Annotation 对象或者是 getAnnotations() 方法。 如果获取到的 Annotation 如果不为 null,则就可以调用它们的属性方法了。

@TestAnnotation()
public class Test {
    public static void main(String[] args) {
        boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class);
        if ( hasAnnotation ) {
            TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class);

            System.out.println("id:"+testAnnotation.id());
            System.out.println("msg:"+testAnnotation.msg());
        }
    }
}

分类

按照运行机制分为

  • 源码注解 注解只在源码中存在,编译成.class文件就不存在了
  • 编译时注解 注解在源码和.class文件中都存在(如:JDK内置系统注解)
  • 运行时注解 在运行阶段还起作用,甚至会影响运行逻辑的注解(如:Spring中@Autowried)

按照来源分为

场景

提供信息给编译器 编译器可以利用注解来探测错误和警告信息 编译阶段时的处理 软件工具可以用来利用注解信息来生成代码、Html文档或者做其它相应处理 运行时的处理 某些注解可以在程序运行的时候接受代码的提取