概念:
注解,也被称为元数据,为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据;
注解的目的:
消除大量的模板化的代码;
注解分为内置注解和元注解;
内置注解如下:
@Override:表示当前方法将覆盖超类中的方法;
@Deprecated:表示当前方法已经过时,在编码时如果使用到这些方法,会出现相应表示,这些方法在未来某个版本可能被去除了;
@SuppressWarning:关闭不当的编译器的警告;
元注解是用于标注注解的注解,元注解描述了当前注解,元注解如下:
@Target:表死当前注解可以用于什么地方,参数ElementType包括:
CONSTRUCTOR:构造器声明;
FIELD:域声明(包括enum实例);
LOCAL_VARIABLE:局部变量声明;
METHOD:方法声明
PACKAGE:包声明
PARAMETER:参数声明
TYPE:类,接口(包括注解类型)或者enum声明;
@Retention:表示需要在什么级别保存该注解的信息,参数RetentionPolicy包括:
SOURCE:注解将被编译器丢弃;
CLASS:注解在class文件中可用,但会被虚拟机抛弃;
RUNTIME:注解将在虚拟机运行期间被保留,这种注解可以沟通过反射机制读取注解的信息,这种注解可以影响代码的逻辑;
@Documented:将此注解包含在javadoc中;
@Inherited:此注解可以被继承;
定义注解:
注解的定义十分简单,类似于接口,如图:
这个注解包含元素stratage,并且这个元素的初始值为proxy;当然注解的元素也可以没有初始值,如果没有初始值,在使用注解的时候如果不带上这个元素的值则这个元素在注解的实例当中就是空;
注解中的元素支持大部分类型,包含所有基本类型,以及以String,Class,enum,Annotation为单位的数组;
需要注意的是,在定义注解的时候,如果你不确定某一个元素是否必定会被赋值,最好给这个元素加上一个初始值;因为编译器不允许元素以一个不确定的值存在,所以常常以默认值为负数或者空字符串来规避这一问题;
要使用注解来规避掉大量模板化的代码的核心是编写注解处理器;
在Java SE5中添加了反射api来帮助程序员构造这类工具;
代码如图:
输出如图:
getDeclaredMethods()方法会返回一个Method[],这个数组包含了这个类的所有声明的方法,包括其父类的方法;
getAnnotation()方法会返回当前方法所拥有的制定类型的注解,如果没有这个类型的注解,则返回null;