注解
1.注解使得Java源代码中不但可以包含功能性的实现代码,还可以添加元数据。注解的功能类似于代码中的注释,所不同的是注解不是提供代码功能的说明,而是实现程序功能的重要组成部分。Java注解已经在很多框架中得到了广泛的使用,用来简化程序中的配置。
2.标记注解,它的出现就代表了某种配置语义,没有元素的注解称为标记注解。而其它的注解是可以有自己的配置参数的。配置参数以名值对的方式出现。
3.在代码中使用注解,就相当于把一部分元数据从XML文件移到了代码本身之中,在一个地方管理和维护。
4.注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
5.java.lang.annotation。
自定义注解
(1)@interface用来声明一个注解。
其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型。可以通过default来声明参数的默认值。
最常见的注解
- @Override:用在方法之上,用来告诉别人这一个方法是改写父类的
- @Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上.
- @SuppressWarnings:暂时把一些警告信息消息关闭
- @Entity:表示该类是可持久化的类
元注解,用来声明注解本身的行为。
@Retention用来声明注解的保留策略,有CLASS、RUNTIME和SOURCE这三种,分别表示注解保存在类文件、JVM运行时刻和源代码中。
只有当声明为RUNTIME的时候,才能够在运行时刻通过反射API来获取到注解的信息。
@Target用来声明注解可以被添加在哪些类型的元素上,如类型、方法和域等。
@Target |
表示该注解可以用于什么地方,可能的ElementType参数有: CONSTRUCTOR:构造器的声明 FIELD:域声明(包括enum实例) LOCAL_VARIABLE:局部变量声明 METHOD:方法声明 PACKAGE:包声明 PARAMETER:参数声明 TYPE:类、接口(包括注解类型)或enum声明 |
@Retention |
表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括: SOURCE:注解将被编译器丢弃 CLASS:注解在class文件中可用,但会被VM丢弃 RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息。 |
@Document |
将注解包含在Javadoc中 |
@Inherited |
允许子类继承父类中的注解 |
注解的参数的可用的类型包括以下几种:所有基本类型、String、Class、enum、Annotation、以上类型的数组形式。参数不能有不确定的值,即要么有默认值,要么在使用注解的时候提供元素的值。而且参数不能使用null作为默认值。注解在只有一个元素且该元素的名称是value的情况下,在使用注解的时候可以省略“value=”,直接写需要的值即可。
使用注解
在程序中添加的注解,可以在编译时刻或是运行时刻来进行处理。
JDK 5中提供了apt工具用来对注解进行处理。在JDK 6中,Java编译器本身就可以完成对注解的处理。
从原理上讲,注解处理器就是通过反射机制获取被检查方法上的注解信息,然后根据注解元素的值进行特定的处理。编写注解处理器的核心是AnnotationProcessorFactory和AnnotationProcessor两个接口。
一、运行时处理注解: