Java注解(Annotation)详解
对于Java开发的同学来说,注解(Annotation)应该是一个非常熟悉的语法,在开发的过程中,我们经常会用到注解,通过注解也让我们的开发变得更加简化;这里我们就来深入浅出的说一下Java中的这个特别重要的特性:注解(Annotation)
注解的介绍(Annotation)
注解是JDK 5.0版本引如的,源码作者Jaoshua Bloch
注解的作用是修饰编程元素(编程元素:包、类、方法、构造方法、成员变量等程序组成部分),提供了一种安全的类似于注释的机制,将信息或元数据与编程元素进行关联。
生成文档。这是最常见的,也是Java 最早提供的注解。常用的有@see @param @return 等 ;
跟踪代码依赖性,实现替代配置文件功能。例如SpringBoot 中大量基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量;
在代码编译时进行格式检查或代码运行时进行配置信息的设置。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
注解的语法与组成
元注解
- @Document:定义该注解是否生成到当前文件的JavaDoc中
- @Retention:定义该注解的生命周期
- @Target:注解修饰的编程元素
- @Inherited:是否允许子类继承父类的注解
元注解的取值范围
@Retention
取值 | 含义 |
---|---|
RetentionPolicy.SOURCE | 只存在于.java文件中,例如:@Override |
RetentionPolicy.CLASS | 存在于.class文件中,编译阶段存在,类加载的时候丢弃,Java默认的就是这种取值 |
RetentionPolicy.RUNTIME | 始终不会丢弃,运行期也会保留该注解,可以使用反射机制读取该注解的信息,例如:@Documented |
@Target
取值 | 含义 |
---|---|
ElementType.TYPE | 类、接口、注解或者枚举 |
ElementType.FIELD | field属性或者枚举常量 |
ElementType.METHOD | 方法声明上 |
ElementType.PARAMETER | 参数 |
ElementType.CONSTRUCTOR | 构造方法 |
ElementType.LOCAL_VARIABLE | 局部变量 |
ElementType.ANNOTATION_TYPE | 注解上使用 |
ElementType.PACKAGE | 描述包 |
注解的语法和定义形式
- 注解以@interface关键字定义
- 注解中可包含成员,成员以无参数的方法形式被声明,方法名是该成员的名称,返回类型是该成员的类型
- 注解的成员赋值是通过@Annotation(name=value)来进行的
- 注解需要标明注解的生命周期(@Retention)和修饰编程元素(@Target)以及是否在JavaDoc中生成(@Documented)和是否被子类继承注解(@Inherited) ,这些信息通过元注解来进行实现
自定义注解
package _20170419;
import java.lang.annotation.*;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Table {String name() default "";
}
代码分析
- @Target(ElementType.TYPE)
表示该注解可作用于类,接口,注解或者枚举中
- @Retention(RetentionPolicy.RUNTIME)
表示该注解在运行时保留,永不丢弃,可以通过反射来获取注解中的成员值
- @Inherited
表示该注解会被子类继承
- @Documented
表示该注解会生成到当前文件的JavaDoc中
- @interface Table
表示该注解名称为Table
- String name() default “”;
表示该注解的成员名称为name,name的类型为String
获取注解的值
package _20170419;
import org.junit.Test;
@Table()
public class TableTest {@Test
public void validTableAnnotation(){
System.out.println(“开始注解过程”);
TableTest tableTest = new TableTest();if (TableTest.class.isAnnotationPresent(Table.class)) {
Table table =
TableTest.class.getAnnotation(Table.class);
System.out.println("name:"+table.name());
}}
}