Java注解编程指南
Java Annotation Tutorial
+1概念
注解是JDK1.5开始引入的一个Java语言新特性。注解是与接口很相似,它与类、接口、枚举是在同一个层次,它 们都称作为java 的一个类型(TYPE)。+1.1Java语言指南解释
注解(也被称做元数据),为我们提供了程序代码的描述信息,而这些描述信息并不属于程序本身。注解并不直接
影响其注释的代码的工作。
+1.2Java编程思想解释
注解(也被称做元数据),为我们在代码中添加信息提供了一种形式化的方法,使我们可以再稍后的某个时刻非常方便
的使用这些数据。
+1.3Java语言规范解释
注解是一个包含注解类型和零或多个键-值对的Java修饰符。其中每个键-值对都绑定了一个不同的注解类型值。注解的
目标简单的说就是绑定信息到其标注的编程元素。
+2用途
注解的用途包括(但不限于)如下:
为编译器提供信息:注解可以被编译器(如Eclipse、IntelliJ)用来检测错误和已知警告,如Java内置的@Deprecated、@Override和@SuppressWarnnings就被经常用到。
编译时和部署时附加操作:软件工具可以在编译时或部署时根据注解信息生成可执行代码,XML文件等等。如生成说明文档,Jax-ws,Jax-rs使用注解生成服务描述的XML文件。
运行时操作:一些注解可以在程序运行时再去进行解释。如下 Hibernate和Ibatis使用它做动态表结构和SQL语句生成等操作Junit从4.x版本开始使用注解简化测试代码和流程AspectJ使用注解提供非侵入式的面向切面编程Spring也使用注解做XML配置管理的一种配合或替代有些工具根据特定的注解做代码分析等等 注解很多时候的确能帮助我们减少、美化代码,或为现有代码增加额外功能等。
-
编译时和部署时附加操作:软件工具可以在编译时或部署时根据注解信息生成可执行代码,XML文件等等。如生成说明文档,Jax-ws,Jax-rs使用注解生成服务描述的XML文件。
-
运行时操作:一些注解可以在程序运行时再去进行解释。如下 Hibernate和Ibatis使用它做动态表结构和SQL语句生成等操作Junit从4.x版本开始使用注解简化测试代码和流程AspectJ使用注解提供非侵入式的面向切面编程Spring也使用注解做XML配置管理的一种配合或替代有些工具根据特定的注解做代码分析等等 注解很多时候的确能帮助我们减少、美化代码,或为现有代码增加额外功能等。
+3原理
像文章开头提到的注解和类、接口一样是一种类型。注解处理程序通过Java的反射机获取程序代码中的注解,然后根据预先设定的处理规则解析处理相关注解以达到主机本身设定的功能目标。
+4语法
+4.1定义
注解的定义和接口的定义相似,又有些不同。以下是定义示例
1.无参数注解
/**java.lang.Deprecated源代码*/
@Documented //将此注解包含在JavaDoc中
@Retention(RetentionPolicy.RUNTIME)//VM运行期仍保留该注解,可通过反射获得。
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})//此注解适用的目标(构造方法、字段、本地变量、方法、包、参数、类型)
public @interface Deprecated
{
//"Deprecated" 为注解名称
//注解均使用@interface声明
}
2.含参数注解
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)//该注解仅保留在Java原文件中
public @interface SuppressWarnings {
/**支持的参数列表all,deprecation,unchecked,fallthrough,path,serial,finally等*/
String[] value();//该注解可接受一个参数数组
}此注解可接受的更多参数参见此处。
3.自定义注解
/* ***************************************************************************** * This software is under the Apache License Version 2.0 * Author: Tao - mail:cn.java.river@gmail.com * Spreading Your Heart **************************************************************************** */ package atao.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 一个包含两个参数的简单测试用例注解,此注解仅适用于"方法". * * @author Tao * @since 1.0 */ @Documented @Target (ElementType.METHOD) @Retention (RetentionPolicy.RUNTIME) public @interface UseCase { /** 测试用例编号 */ public int id(); /** 测试用例描述 */ public String description() default "no description"; }4.最简单的注解
@interface Naked{}
5.允许子类继承父类的注解
/**允许子类继承父类的注解*/
@Inherited
public @interface TrustFather{}
总结,注解定义包含:
主题声明,权限修饰符 + @interface + 注解名称 注解描述 适用目标:@Target保留级别:@Retention是否产生JavaDoc:@Documented允许子类继承父类的注解: @Inherited其他注解 注解包含字段设定(例子2、3中)+4.2使用
/* ***************************************************************************** * This software is under the Apache License Version 2.0 * Author: Tao - mail:cn.java.river@gmail.com * Spreading Your Heart **************************************************************************** */ package atao.annotation; import java.util.ArrayList; import java.util.List; /** * 一个使用如上注解密码工具类 * * @author Tao * @since 1.0 */ public class PasswordUtils { @UseCase (id = 47, description = "密码必须包含至少一个数字") public boolean validatePassword (