定义
从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解
Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
注解分类
Java自带的标准注解
包括@Override(标明重写某个方法)、@Deprecated(标明某个类或方法过时)和@SuppressWarnings(标明要忽略的警告),使用这些注解后编译器就会进行检查。
元注解
元注解是用于定义注解的注解,包括
@Retention
标明注解被保留的阶段,它解释说明了这个注解的的存活时间
- RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
- RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
- RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
@Target
标明注解使用的范围
- @Target(ElementType.TYPE) //接口、类、枚举、注解
- @Target(ElementType.FIELD) //字段、枚举的常量
- @Target(ElementType.METHOD) //方法
- @Target(ElementType.PARAMETER) //方法参数
- @Target(ElementType.CONSTRUCTOR) //构造函数
- @Target(ElementType.LOCAL_VARIABLE)//局部变量
- @Target(ElementType.ANNOTATION_TYPE)//注解
- @Target(ElementType.PACKAGE) ///包
@Inherited
标明注解可继承,说明子类可以继承父类中的该注解,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。
@Documented
标明是否生成javadoc文档,顾名思义,这个元注解肯定是和文档有关。它的作用是能够将注解中的元素包含到 Javadoc 中去。
@Repeatable
可重复,1.8 的新的特性。什么样的注解会多次应用呢?通常是注解的值可以同时取多个。
自定义注解
可以根据自己的需求定义注解。例如:
@Tiger
测试
通过反射获取类方法
XML和注解区别
- 注解:是一种分散式的元数据,与源代码紧绑定
- xml:是一种集中式的元数据,与源代码无绑定
注解的用途
- 生成文档,通过代码里标识的元数据生成javadoc文档。
- 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证,如@Override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
- 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。
- 跟踪代码依赖性,实现替代配置文件功能,比较常见的是spring 2.5 开始的基于注解配置,作用就是减少配置。
- 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例,在反射的 Class, Method, Field 等函数中,有许多于 Annotation 相关的接口,可以在反射中解析并使用 Annotation。
- …