注解:将来的发展趋势
从JDK5.0开始, Java增加了对元数据(MetaData)的支持,
也就是 Annotation(注解)。?
Annotation其实就是代码里的特殊标记,
它用于替代配置文件,也就是说,
传统方式通过配置文件告诉类如何运行,
有了注解技术后,开发人员可以通过注解告诉类如何运行。
在Java技术里注解的典型应用是:可以通过反射技术去得到
类里面的注解,以决定怎么去运行类。?
使用注解的步骤
- 何定义注解。
- 把注解应用到对应的目标上
- 通过反射的api,反射注解,并根据反射的注解信息,
决定如何去运行类
如何定义注解
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
//不是接口方法,是注解的属性
public String value();
public String name() defalut "abc";
public String[] colors() default {};
}
元注解:用于修饰注解的注解。
@Target(ElementType.XXX)//应用的目标
@Retention(RetentionPolicy.SOURCE)//注解的保留策略
@Documented//生成注解的文档
元注解详解:
@Target(ElementType.METHOD):被修饰的注解能够在什么地方使用
(注解、类/接口、字段、方法、构造方法、参数上..)上面使用。
ElementType:
ANNOTATION_TYPE 注解类型声明
CONSTRUCTOR 构造方法声明
FIELD字段声明(包括枚举常量)
LOCAL_VARIABLE局部变量声明
METHOD 方法声明
PACKAGE 包声明
PARAMETER 参数声明
TYPE 类、接口(包括注释类型)或枚举声明
@Retention(RetentionPolicy.RUNTIME)
被它修饰的注解保留域。
编译器 类加载器 JVM
.java-> .class->加载->运行
SOURCE:源码级别,给编译器看的,
编译完之后直接丢弃该种策略的注解。
生成的.class字节码文件中没有该类型的注解
CLASS: 给类加载器看的,
在类加载时可以做一系列引导操作。
编译器编译后存在,类加载器加载完之后,
丢弃该保留域的注解。
RUNTIME:给JVM看的,在程序运行的过程中做相关的
操作。编译器编译后保留,
类加载器加载后保留,
在JVM运行时通过反射技术反射使用的是
什么注解,注解属性的值是什么,
根据他们两个的值做对应的操作。
@Documented:自定义的注解如果使用Documented注解,
生成的doc文档上,使用该自定义注解的
地方会显示注解信息;
如果去掉@Documented,
生成的doc文档上将不再有注解信息。
注解中的属性详解
a.注解定义属性和接口中定义方法类似,缺省默认是public。
public 类型 属性名称();
b.定义属性时,如果没有使用default指定默认值,
使用当前注解必须为该属性赋值
(可以利用该特点,设置必须赋值的属性不要
使用default指定默认值)。
使用default指定默认之后,该属性在注解使用时可以赋值,
也可以不赋值。
c.注解中的属性类型是有要求的,
可以是八种基本数据类型,可以是枚举类型、
Class类型、String等,以及以上类型的“一维”数组
比如:String[] likes() default {};
在注解使用时,如果数组类型的属性的值是一个值得话,
赋值时可以把“{}”省略掉。@Anno1(name="zs",likes="fb")
d.存在一个特殊的属性:value,
如果只为该属性赋值,value=可以省略;
但是如果为注解中多个属性同时赋值的话,
value=是不可以省
把注解应用到对应的目标上
在对应的目标写
@注解的名称(属性名=属性值)
@注解的名称(属性名1=属性值1,属性名2=属性值2,…属性名n=属性值n)
反射注解
参见项目代码
总结:用注解就是根据注解和注解上的属性值,来决定是否做一些事可以是执行指定的功能,也可以是调用一个具体的方法
步骤
- 自定义注解
- 注解放在指定位置
- 写反射代码解析注解
- 根据注解和注解的属性做功能