Java 注解
了解 Java 注解,对于我们了解 JavaPoet, ARouter, Butterknife 这些开源库是必须的。
同时也可以结合 Android 中独有的注解,一起看,会加深理解。我之前写过
Android 中的注解 一文。
以下是正题:
注解是那些插入到源码中使用其他工具可以对其进行处理的便签。这些工具可以在源码层次上进线操作,或者可以出来编译在其中放置了注解的类文件。
This allows annotations to be retained by Java VM at run-time and read via reflection。[1]
Annotation are tags or meta-data, which can be inserted in to source code. So that it could be process at runtime and can take decision according to that annotations。[2]
1. 注解的语法
注解是由注解接口定义的
1 | modifiers AnnotationName{ |
实例:
1 | public BugReport{ |
2. 注解的类型
用于编译的注解 | 作用 |
---|---|
@Deprecated | 用于不再鼓励使用的项 |
@SuppressWarning | 阻止某个给定类型的警告信息 |
@Override | 检查改方法是否覆盖了某一个超类方法 |
@Generated | 作为代码生成工具使用 |
用于管理资源的注解 | 作用 |
---|---|
@PostConstruct | 被标记的方法应该在构造之后立即被调用 |
@PreDestroy | 被标记的方法应该在被移除之前立即被调用 |
@Resource | 用于资源的注入 |
元注解 | 作用 |
---|---|
@Target | 指明可以应用这个注解的那些项 |
@Retention | 指明这个注解可以保留多久 |
@Documented | 指明这个注解应该包含在注解项的文档中 |
@Inherited | 指明这个注解应用与一个类的时候,能够自动被它的子类继承 |
@Target 注解的元素类型
元素类型 | 注解适用场合 |
---|---|
TYPE | 类(包括 enum)及接口(包括注解类型) |
ANNOTATION_TYPE | 注解类型声明 |
PACKAGE | 包 |
METHOD | 方法 |
CONSTRUTOR | 构造器 |
FIELD | 成员域(包括 enum 常量) |
PARAMETER | 方法或构造参数 |
LOCAL_VARIABLE | 局部变量 |
@Retention
用于指定一条注解应该保留多长时间
保留规则 | 描述 |
---|---|
SOURCE | 不包括在类文件中的注解 |
CLASS | 包括在类文件中的注解,但是虚拟机不需要将它们载入 |
RUNTIME | 包括在类文件中的注解,并由虚拟机载入。通过反射API 可获得它们 |
例子:
1 | (ElementType.METHOD) |
3. 注解处理器类库
1. java.lang.reflectAnnotatedElement
1 | boolean isAnnotationPresent(Class<? extends Annotation> annotationType) |
例子:
1 | try { |
2. AbstractProcessor
1 | (Processor.class) |
4.参考资料
- Wiki 中的 Java annotation;
- 《Java 核心技术 卷 II 》第十章 注解部分;