Java核心编程十三:注解

本文详细介绍了Java注解的定义、语法、标准注释、源码级别注解处理器、运行时注解及字节码工程应用。注解不仅用于描述代码,还能够触发编译器或运行时的行为,实现代码的自描述性和增强代码的可维护性。
1 注解数据
注解是插入到源代码中,用于工具处理的标签。在JDK5之前,注解只用来描述代码,而现在可以利用工具将任务数据插入到现有的源代码中。

2 注解语法
自定义注解,由接口来实现的;自定义的注解类都隐含的继承自Java.lang.annotation.Annotation接口,这是一个普通接口。
modifiers @interface AnnotName
{
    type element1() [ default value ];
    type element2() [ default value ];
}
类型只能为以下几种类型:基本类型如int等,String,Class类,enum类型,注解类型(嵌套),由前面类型组成的一维数组。
由于注解是由编译器计算而来的,因此所有的元素必须是编译期常量。

注解在定义之后,使用时的形式如下:
@AnnotName(element1=val1,element2={val2,val3}...)
元素的顺序没有限制,如果某个元素没有指定,则使用声明的默认值;
注解元素不能使用null值,只能使用""或Void.class。
如果元素的值是数组,则使用{}括起来。

如果使用的注解不包含元素,或者元素都使用默认值,则注解可以简化为@Annotation,可以去掉括号后的内容。
如果注解只包含一个元素,并且元素名称为value(),我们在使用的时候可以去掉赋值的形式,@Annotation(val)。

注解可以应用到的项有包、类、接口、方法、构造器、实例成员、本地变量、参数变量上。一个项可以被多个注解说明,但同一类型的注解不能使用多次。如果要使用多次,需要定义一个包含多个注解的注解。

java.lang.annotation.Annotation接口
Class<? extends Annotation> annotationType() 返回注解的元类

java.lang.reflect.AnnotatedElement类
<T extends Annotation> getAnnotation(Class<T> aclass)  如果项存在指定类型的注解,则返回,否则返回
Annotation[] getAnnotations()  返回所有的注解,包含继承的
Annotation[] getDeclaredAnnotations() 返回此条目所声明的注解
bool isAnnotationPresent(Class<? extends Annotation> aclass) 是否存在给定类型的注解

3 标准注释
JDK6起定义的注解有如下几个,javax包里有更多的注解,不在此解释。

3.1 编译项注解
@Deprecated  表示不鼓励使用的项,当使用时编译器会产生警告。
@SuppressWarnings 告诉编译器不对特定类型问题进行警告,如@suppressWarnings("unchecked")
@Override 告诉编译器本方法是重写的方法。当然在一个不允许重载的方法上使用,则产生错误。
3.2 资源注解
对于对象,可以控制对象的生命期。对于方法,可以控制期执行时刻。
@PostConstruct 
@PreDestroy
@Resource 用于替换注入,在JRE7中好像没找到
3.3 元注解
用于说明注解的注解。
@Target 用于说明注解的适用类型,如ElementType.METHOD,没有Target注解的项可以用于任意类型。

@Retention 用于说明注解的存在范围,默认值为RetentionPolicy.CLASS。

@Document 用于让文档工具进行信息抽取生成此注解标记项的文档
@Inherit 用于让此注解可以同时让子类继承

4 源码级别的注解处理器
在JDK5时,需要使用外部apt工具来处理带有注解的类,在jdk6中已经可以直接使用javac来处理注解了。
对于用于处理源码级的注解的方法是继承自AnnotationProcess类,并实现process方法,假设我们实现的类名是proAnno.java,编译此类。然后写一个使用注解类。
javac -processor proAnno classWithAnno.java

5 运行时注解
需要在运行时使用反射机制获取注解的数据,并进行处理。例如将一系列类,在运行时注册到某个集合中。
为此反射类中增加了获取条目上的注解的API。Junit便采用注解的方式来声明测试用例。
下面的示例采用注解的方式增加了一种运行时权限控制。



6 字节码工程
通过注解可以处理编译的字节码,并插入自己的代码。这已经属于比较高级的hack行为,暂时不在此描述。

7 用途
使用注解标记字段和方法,可通过反射的手段截取注解及其标记的字段和方法的元数据,并根据需求对元数据进行处理。
它赋予了字段和方法额外的意义,提供了一种统一处理字段和方法的优雅的方式。
注解更多的意义是提供了一种设计模式,在本质上它没有增强Java的能力,使用注解实现的功能都可以以非注解的方式实现,只是通过注解可以让代码看起来更加显示描述性一些。




Java核心技术》出版以来一直畅销不衰,深受读者青睐,每个新版本都尽可能快地跟上Java开发工具箱发展的步伐,而且每一版都重新改写了部分内容,以便适应Java的最新特性。本版也不例外,它反映了Java SE 6的新特性。全书共14章,包括Java基本的程序结构、对象与类、继承、接口与内部类、图形程序设计、事件处理、Swing用户界面组件、部署应用程序和Applet、异常日志断言和调试、泛型程序设计、集合以及多线程等内容。. 全书对Java技术的阐述精确到位,叙述方式深入浅出,并包含大量示例,从而帮助读者充分理解Java语言以及Java类库的相关特性。对于想将Java应用于实际项目中的程序员来说,《Java核心技术——基础知识》修订版是一本权威性的指导书籍。对于Java SE 6平台的全部更新,这本实用的教程和可靠的参考书通过大量测试过的示例说明了最重要的语言特性和类库特性。示例程序经过精心地设计,不但具有实用价值,而且易读、易理解,可以作为自己编写程序的良好开端。.. 卷I试图让读者快速地了解Java SE 6的新特性,并帮助有效地从Java早期版本升级到最新版本,或从一种其他的语言变换为使用Java语言。作者十分注重Java语言的基本概念以及用户界面程序设计基础。下面是本卷详细介绍的主要内容: Java语言基础知识面向对象程序设计接口与内部类事件监听器模型 Swing图形用户界面程序设计打包应用程序异常处理登陆与调试泛型化程序设计集合框架多线程... 【作译者介绍】 本书提供作译者介绍 Cay S. Horstmann参与编写《Core JavaServer Faces》第2版(Prentice Hall, 2007)。Cay是圣何塞州立大学计算机科学系教授、Java的倡导者,并经常在计算机会议上讲演。. Cray Cornell已经编写并教授程序设计专业课程20余年,是Apress的创始人。他撰写的程序设计专业书籍十分畅销,是Jolt Award的最终获奖者之一,并通过Visual Basic资料赢得了Readers Choice。...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值