java注解 博客园_java注解

注解的概念

注解是JDK1.5的新特性。

注解相当一种标记,是类的组成部分,可以给类携带一些额外的信息。

标记(注解)可以加在包,类,字段,方法,方法参数以及局部变量上。

注解是给编译器或JVM看的,编译器或JVM可以根据注解来完成对应的功能。

注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,以后,javac编译器、开 发工具和其他程序可以通过反射来了解你的类及各种元素上有无何种 标记,看你的程序有什么标记,就去 干相应的事,标记可以加在包、类,属性、方法,方法的参数以及局部变量上。

注解的作用

注解的作用就是给程序带入参数。

以下几个常用操作中都使用到了注解:

1. 生成帮助文档:

@author和@version

@author:用来标识作者姓名。

@version:用于标识对象的版本号,适用范围:文件、类、方法。

使用@author和@version注解就是告诉Javadoc工具在生成帮助文档时把作者姓名和版本号也标 记在文档中。

如下图:

792c87ab3f0bbac66c64ffee872f18ac.png

2. 编译检查:

@Override @Override:用来修饰方法声明。

用来告诉编译器该方法是重写父类中的方法,如果父类不存在该方法,则编译失败。

如下图

0018bc71f6ea2941e84cd0e6b5a39edd.png

常见注解

1. @author:用来标识作者名,eclipse开发工具默认的是系统用户名。

2. @version:用于标识对象的版本号,适用范围:文件、类、方法。

3. @Override :用来修饰方法声明,告诉编译器该方法是重写父类中的方法,如果父类不存在该方法,则编译 失败。

自定义注解

f4023b980026af858fc6a61af8fbd89b.png

以上定义出来的注解就是一个最简单的注解了,但这样的注解意义不大,因为注解中没有任何内容,就好像 我们定义一个类而这个类中没有任何成员变量和方法一样,这样的类意义也是不大的,所以在定义注解时会 在里面添加一些成员来让注解功能更加强大,这些成员就是属性。接下来就看看怎么给注解添加属性。

注解的属性

1. 属性的作用 可以让用户在使用注解时传递参数,让注解的功能更加强大。

2. 属性的格式

格式1:数据类型 属性名();

格式2:数据类型 属性名() default 默认值;

3. 属性定义示例

003e3666fb125a6b001d8abdd457c4bf.png

属性适用的数据类型 八种基本数据类型(int,float,boolean,byte,double,char,long,short)

String类型,Class类型,枚举类型,注解类型

以上所有类型的一维数组

定义注解

2e8799a8000ad5447e84f35642eaf837.png

f73cf1b11d52317d67def5e19ecf940d.png

157cd0f17b41b64e2e7b19dfd63ba481.png

使用注意事项

如果属性有默认值,则使用注解的时候,这个属性可以不用赋值。

如果属性没有默认值,那么在使用注解时一定要给属性赋值。

特殊属性value

1. 当注解中只有一个属性且名称是value,在使用注解时给value属性赋值可以直接给属性值,无论value是单 值元素还是数组类型。

d2a3cf01c9e5a941c3412cb02f37b656.png

66023e73862a7c48ded8137c0d7931ff.png

如果注解中除了value属性还有其他属性,且至少有一个属性没有默认值,则在使用注解给属性赋值时, value属性名不能省略。

2ba46ccb3cb87fd4a144b92db5237681.png

a7dc0b5d98f76b3e4e4e35f50403fee6.png

问题分析

现在我们已经学会了如何定义注解以及如何使用注解了,可能细心的同学会发现一个问题:

我们定义的注解是可以 使用在任何成员上的,比如刚刚Book注解的使用:

922f474ddc1549b65d0ad698f060eee9.png

f0710d38efd7f2566698d10822e93be5.png

此时Book同时使用在了类定义上或成员方法上,编译器也没有报错,因为默认情况下,注解可以用在任何地 方,比如类,成员方法,构造方法,成员变量等地方。 如果要限制注解的使用位置怎么办?那就要学习一个新的知识点:元注解。接下来就来看看什么是元注解以 及怎么使用。

注解之元注解

1 元注解的概述

Java API提供的注解

专门用来定义注解的注解。

任何Java官方提供的非元注解的定义中都使用到了元注解。

常用元注解

@Target

@Retention

元注解之@Target

作用:指明此注解用在哪个位置,如果不写默认是任何地方都可以使用。

可选的参数值在枚举类ElemenetType中包括:

28b58657bef44686460fdee13eed178d.png

元注解之@Retention

作用:定义该注解的生命周期(有效范围)。

可选的参数值在枚举类型RetentionPolicy中包括

8f673490b24f1d76c744c52e7ba241ff.png

元注解使用示例

3c6974151e5a27b3b0173dc56cd733b5.png

dcffcd319cf96734eae19375bdcad9ba.png

9dbb5c8076472490749347a43ca6fd00.png

注解解析

什么是注解解析

通过Java技术获取注解数据的过程则称为注解解析。

与注解解析相关的接口 Anontation:所有注解类型的公共接口,类似所有类的父类是Object。

AnnotatedElement:定义了与注解解析相关的方法,常用方法以下四个

1c816e525362782c7050c19d50f066f5.png

获取注解数据的原理

注解作用在那个成员上,就通过反射获得该成员的对象来得到它的注解。

如注解作用在方法上,就通过方法(Method)对象得到它的注解

719c4171ba73bc883223ce8ad38d304d.png

如注解作用在类上,就通过Class对象得到它的注解

20bbe89954e92bfc9b54dbc10601cb7c.png

使用反射获取注解的数据

7ecf2f05836e7d4e4e57a944e6fd183b.png

aca26ed94a49bd9471c540d6bb84722f.png

cd37a19309dddbb11a0ea53fd1247934.png

4cdb694ef27fb412fb0e7ccd201aa234.png

da76608f65b0bccc99676099bb4a8e5f.png

73aefd0de961d94621107cb693e45aa3.png

存在问题分析

TestAnnotation类在获取注解数据时处理得不够严谨,假如出现下面的其中一种情况:

1. 把BookStore类或成员方法buyBook上的注解删除。

2. 将Book注解的有效范围改为:CLASS。

再运行TestAnnotation类代码则会出现空指针异常

2c8fc75f1951805c887cda002a96f169.png

56921c71166d62e66bda5acf50e59d61.png

482cff6340d81fc98ff12ff7504a4aaf.png

解决方案 在获取注解对象时,先判断是否有使用注解,如果有,才获取,否则就不用获取。

38234a80a6b292e2455f6949b7404c82.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值