java注解
注解的概念
注解是JDK1.5的新特性。
注解相当一种标记,是类的组成部分,可以给类携带一些额外的信息。
标记(注解)可以加在包,类,字段,方法,方法参数以及局部变量上。
注解是给编译器或JVM看的,编译器或JVM可以根据注解来完成对应的功能。
注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,以后,javac编译器、开 发工具和其他程序可以通过反射来了解你的类及各种元素上有无何种 标记,看你的程序有什么标记,就去 干相应的事,标记可以加在包、类,属性、方法,方法的参数以及局部变量上。
注解的作用
注解的作用就是给程序带入参数。
以下几个常用操作中都使用到了注解:
1. 生成帮助文档:
@author和@version
@author:用来标识作者姓名。
@version:用于标识对象的版本号,适用范围:文件、类、方法。
使用@author和@version注解就是告诉Javadoc工具在生成帮助文档时把作者姓名和版本号也标 记在文档中。
如下图:
2. 编译检查:
@Override @Override:用来修饰方法声明。
用来告诉编译器该方法是重写父类中的方法,如果父类不存在该方法,则编译失败。
如下图
常见注解
1. @author:用来标识作者名,eclipse开发工具默认的是系统用户名。
2. @version:用于标识对象的版本号,适用范围:文件、类、方法。
3. @Override :用来修饰方法声明,告诉编译器该方法是重写父类中的方法,如果父类不存在该方法,则编译 失败。
自定义注解
以上定义出来的注解就是一个最简单的注解了,但这样的注解意义不大,因为注解中没有任何内容,就好像 我们定义一个类而这个类中没有任何成员变量和方法一样,这样的类意义也是不大的,所以在定义注解时会 在里面添加一些成员来让注解功能更加强大,这些成员就是属性。接下来就看看怎么给注解添加属性。
注解的属性
1. 属性的作用 可以让用户在使用注解时传递参数,让注解的功能更加强大。
2. 属性的格式
格式1:数据类型 属性名();
格式2:数据类型 属性名() default 默认值;
3. 属性定义示例
属性适用的数据类型 八种基本数据类型(int,float,boolean,byte,double,char,long,short)
String类型,Class类型,枚举类型,注解类型
以上所有类型的一维数组
定义注解
使用注意事项
如果属性有默认值,则使用注解的时候,这个属性可以不用赋值。
如果属性没有默认值,那么在使用注解时一定要给属性赋值。
特殊属性value
1. 当注解中只有一个属性且名称是value,在使用注解时给value属性赋值可以直接给属性值,无论value是单 值元素还是数组类型。
如果注解中除了value属性还有其他属性,且至少有一个属性没有默认值,则在使用注解给属性赋值时, value属性名不能省略。
问题分析
现在我们已经学会了如何定义注解以及如何使用注解了,可能细心的同学会发现一个问题:
我们定义的注解是可以 使用在任何成员上的,比如刚刚Book注解的使用:
此时Book同时使用在了类定义上或成员方法上,编译器也没有报错,因为默认情况下,注解可以用在任何地 方,比如类,成员方法,构造方法,成员变量等地方。 如果要限制注解的使用位置怎么办?那就要学习一个新的知识点:元注解。接下来就来看看什么是元注解以 及怎么使用。
注解之元注解
1 元注解的概述
Java API提供的注解
专门用来定义注解的注解。
任何Java官方提供的非元注解的定义中都使用到了元注解。
常用元注解
@Target
@Retention
元注解之@Target
作用:指明此注解用在哪个位置,如果不写默认是任何地方都可以使用。
可选的参数值在枚举类ElemenetType中包括:
元注解之@Retention
作用:定义该注解的生命周期(有效范围)。
可选的参数值在枚举类型RetentionPolicy中包括
元注解使用示例
注解解析
什么是注解解析
通过Java技术获取注解数据的过程则称为注解解析。
与注解解析相关的接口 Anontation:所有注解类型的公共接口,类似所有类的父类是Object。
AnnotatedElement:定义了与注解解析相关的方法,常用方法以下四个
获取注解数据的原理
注解作用在那个成员上,就通过反射获得该成员的对象来得到它的注解。
如注解作用在方法上,就通过方法(Method)对象得到它的注解
如注解作用在类上,就通过Class对象得到它的注解
使用反射获取注解的数据
存在问题分析
TestAnnotation类在获取注解数据时处理得不够严谨,假如出现下面的其中一种情况:
1. 把BookStore类或成员方法buyBook上的注解删除。
2. 将Book注解的有效范围改为:CLASS。
再运行TestAnnotation类代码则会出现空指针异常
解决方案 在获取注解对象时,先判断是否有使用注解,如果有,才获取,否则就不用获取。