5. Annotation的分类
Annotation按照一定的规则,可以分为若干种类型。 首先,根据Annotation本身的特征有没有输入参数,可以分为以下两个类型:
- Marker Annotation
标识Annotation,该Annotation没有参数输入,更多类似于标识一个东西,类似于Java语言中的java.io.Serialable之类的接口,并无需要实现的方法。
示例: @Override, 用以标识该方法需要覆盖父类的同名方法,Annotation无参数输入。
public class MarkerAnnotationTest {
@Override // --- marker annotation
public String toString() {
//print out information
}
}
- 普通Annotation
其可以基于Annotation进行参数的设置,例如@SuppressWarnings。示例如下:
// --- 省略其他方法
@SuppressWarnings(value={"unchecked","fallthrough"})
public void generalAnnotationMethod() {
//省略方法体
}
在普通的Annotation中,通过选择设置参数值,可以提供更为强大的功能控制。这里的@SuppressWarnings只是提供了一个参数的使用,更多方法的使用可以参考其Java API的说明。
第二种分类方法是根据Annotation的应用对象来划分,分为标注代码的Annotation和用来标注Annotation的Annotation,即Meta-Annotation,元标注。
- 标注代码的Annotation
我们平时定义和使用的绝大多数都是用来标注代码的Annotation,直接应用在java中的包、类,方法和变量之中。具体的例子就不再赘述了。
- 标注Annotation的Annotation
此类Annotation用以定义Annotation之时,需要进行声明和说明的内容,例如,@Target(应用的对象), @Rention(代码,class或运行环境),@Documented(出现在爱javadoc中), @Inherted(标注类型是否可以被继承)。更为详细的内容将在下一节详述。
第三种分类方法就是按照Annotation的具体功能来划分,主要有以下三种类型,基本和Annotation的设计初衷相契合。
- 文档标注
主要是@Documented,用以标注是否在javadoc中
- 编译检查
主要在编译过程中,给Java编译器若干指令,检查Java代码中是否存在若干题, 改变编译器的动作或者行为,通过Annotation的使用,可以调整和控制编译器的使用以及让编译器提供关于代码的更多的检查和验证。主要有:@Override,@SuppressWarning,
- 代码分析
此类Annotation是在我们开发中使用最多的,主要是通过Annotation提供给代码更多的额外特性和设置,在Java运行过程中发挥作用。常见的是在Spring或者Hibernate等框架中出现的@Controller,@Service,@Bean, @Table, @Enitty等等.
总结: 我们这所以给Annotation如此之详尽的分类,不是为了分类而分类,而是期望通过分类,让大家对Annotation有更深入的理解,每一种类型都是Annotation的都是一种理解Annotation的角度和方式。
总之,我的分类不完全准确,却可以给你更多的看待问题的角度。