(1)Annotation其实就是代码里面的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。
(2)Annotation可以像修饰符一样被使用,可用于修饰包,类,构造器、方法、成员变量、参数、局部变量的声明,这些信息被保存在Annotation的"name = value"对中。
(3)在JavaSE里面,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE 里面,注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE 旧版中所遗留的代码和XML配置等。
(4)未来的开发模式都i是基于注解的,JPA 和Spring 都是基于注解模式的,一定程度上可以说
框架 = 注解 + 反射 + 设计模式
注解的使用示例
* (1)生成文档相关的注解如@author和@version等 * (2)在编译时进行格式检查(JDK内置的三个基本注解) * @override:限定重写父类方法,该注解只能用于方法 * @Deprecated:用于表示所修饰的元素(类、方法等)已经过时了 * @suppressWarnings:抑制编译器警告 * (3)跟踪代码依赖性,实现替代配置文件的功能 *
如何自定义注解?
public @interface MyAnnotation {
String value() default "hello";
}
(1)注解声明为@Interface
(2)内部定义成员,通常使用value表示
(3)可以指定成员的默认值,使用default定义
(4)如果自定义注解没有成员,则表示是一个标识
如果注解有成员在使用注解的时候需要指明成员的值,如果成员有默认值不指定也行。
自定义注解需要配上注解的信息处理流程(反射)才有意义,即在某个方法或类上面标明了某个 * 注解后,再使用反射去读取注解的值,才能发挥注解的作用。
JDK提供的四个元注解。元注解:即对现有注解进行解释说明的注解。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
(1)Retention:该注解用于指定一个注解的生命周期,有三个周期可以指定即source class runtime。
当指定了@Retention(RetentionPolicy.SOURCE)修饰注解的时候,Annotations are to be discarded by the compiler.即在.class文件里面见不到@Retention修饰的注解。
当指定了@Retention(RetentionPolicy.CLASS)修饰某个注解的时候,在.class文件里面可以看见该注解,但是在JVM里面看不见了。如果没有指定RetentionPolicy默认为CLASS。
当指定了@Retention(RetentionPolicy.RUNTIME)修饰某个注解的时候,在.class文件里面可以看见该注解,在JVM内存里面也可以看见。
只有声明为@Retention(RetentionPolicy.RUNTIME)的注解才可以通过反射来获取。
(2)Target
用于指定被修饰的注解可以修饰哪些程序元素,如可以修饰类、构造器、方法、属性啊等
下面两个注解用得比较少:
(3)documented 表明所修饰的注解在被javadoc解析时会被保留下来,默认的时不保留的。
(4)Inherited 被它修饰的注解将具有继承性,如果父类声明了该注解,那么它的子类也会有该注解。
通过反射获得注解信息:
注解在Employee上面
通过反射得到注解的相关信息
public class AnnotattionTest01 {
public static void main(String[] args) {
Class employeeClass = Employee.class;
Annotation[] annotations = employeeClass.getAnnotations();
for(int i = 0;i < annotations.length;i++){
System.out.println(annotations[i]);
}
}
}
//输出::::@com.sf.jinjian.annotation.MyAnnotation(value=hi)
JDK8里面的一些新特性;



