java基础之annotation解读_第1页
java基础之annotation解读_第2页
java基础之annotation解读_第3页
java基础之annotation解读_第4页
java基础之annotation解读_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java 基础之理解 Annotation 一、概念 Annontation 是 Java5 开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似 注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等) 进行关联。 更通俗的意思是为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说 明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的。 Annontation 像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变 量的声明语句中。 二、原理 Annotation 其实是一种接口。通过 Java 的反射机制相关的 API 来访问 annotation 信息。相 关类(框架或工具中的类)根据这些信息来决定如何使用该程序元素或改变它们的行为。 annotation 是不会影响程序代码的执行,无论 annotation 怎么变化,代码都始终如一地执行。 Java 语言解释器在工作时会忽略这些 annotation,因此在 JVM 中这些 annotation 是“不起作 用”的,只能通过配套的工具才能对这些 annontaion 类型的信息进行访问和处理。 Annotation 与 interface 的异同: 1)、Annotation 类型使用关键字interface 而不是 interface。 这个关键字声明隐含了一个信息:它是继承了 java.lang.annotation.Annotation 接口,并非声 明了一个 interface 2)、Annotation 类型、方法定义是独特的、受限制的。 Annotation 类型的方法必须声明为无参数、无异常抛出的。这些方法定义了 annotation 的成 员:方法名成为了成员名,而方法返回值成为了成员的类型。而方法返回值类型必须为 primitive 类型、Class 类型、枚举类型、annotation 类型或者由前面类型之一作为元素的一维数 组。方法的后面可以使用 default 和一个默认数值来声明成员的默认值,null 不能作为成员默认 值,这与我们在非 annotation 类型中定义方法有很大不同。 Annotation 类型和它的方法不能使用 annotation 类型的参数、成员不能是 generic。只有返 回值类型是 Class 的方法可以在 annotation 类型中使用 generic,因为此方法能够用类转换将各 种类型转换为 Class。 3)、Annotation 类型又与接口有着近似之处。 它们可以定义常量、静态成员类型(比如枚举类型定义)。Annotation 类型也可以如接口 一般被实现或者继承。 三、应用场合 annotation 一般作为一种辅助途径,应用在软件框架或工具中,在这些工具类中根据不同的 annontation 注解信息采取不同的处理过程或改变相应程序元素(类、方法及成员变量等)的行 为。 例如:Junit、Struts 、Spring 等流行工具框架中均广泛使用了 annontion。使代码的灵活性大 提高。 四、常见标准的 Annotation 从 java5 版本开始,自带了三种标准 annontation 类型, (1)、Override java.lang.Override 是一个 marker annotation 类型,它被用作标注方法。它说明了被标注的方 法重载了父类的方法,起到了断言的作用。如果我们使用了这种 annotation 在一个没有覆盖父 类方法的方法时,java 编译器将以一个编译错误来警示。 这个 annotaton 常常在我们试图覆盖父类方法而确又写错了方法名时加一个保障性的校验过 程。 (2)、Deprecated Deprecated 也是一种 marker annotation。当一个类型或者类型成员使用Deprecated 修饰的 话,编译器将不鼓励使用这个被标注的程序元素。所以使用这种修饰具有一定的 “延续性”:如 果我们在代码中通过继承或者覆盖的方式使用了这个过时的类型或者成员,虽然继承或者覆盖 后的类型或者成员并不是被声明为 Deprecated,但编译器仍然要报警。 注意:Deprecated 这个 annotation 类型和 javadoc 中的 deprecated 这个 tag 是有区别的: 前者是 java 编译器识别的,而后者是被 javadoc 工具所识别用来生成文档(包含程序成员为什 么已经过时、它应当如何被禁止或者替代的描述)。 (3)、SuppressWarnings 此注解能告诉 Java 编译器关闭对类、方法及成员变量的警告。 有时编译时会提出一些警告,对于这些警告有的隐藏着 Bug,有的是无法避免的,对于某 些不想看到的警告信息,可以通过这个注解来屏蔽。 SuppressWarning 不是一个 marker annotation。它有一个类型为 String的成员,这个成员的 值为被禁止的警告名。对于 javac 编译器来讲,被-Xlint 选项有效的警告名也同样对 SuppressWarings 有效,同时编译器忽略掉无法识别的警告名。 annotation 语法允许在 annotation 名后跟括号,括号中是使用逗号分割的 name=value 对用 于为 annotation 的成员赋值: 代码: SuppressWarnings(value=“unchecked“,“fallthrough“) public void lintTrap() /* sloppy method body omitted */ 在这个例子中 SuppressWarnings annotation 类型只定义了一个单一的成员,所以只有一个简单的 value=.作为 name=value 对。又由于成员值是一个数组,故使用大括号来声明数组值。 注意:我们可以在下面的情况中缩写 annotation:当 annotation 只有单一成员,并成员命名为 “value=“。这时可以省去“value=“。比如将上面的 SuppressWarnings annotation 进行缩写: 代码: SuppressWarnings(“unchecked“,“fallthrough“) 如果 SuppressWarnings 所声明的被禁止警告个数为一个时,可以省去大括号: SuppressWarnings(“unchecked“) 五、自定义 annontation 示例 示例共涉及四个类: 清单 1:Author.java package com.magc.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; /* * 定义作者信息,name 和 group * author magc * */ Retention(RetentionPolicy.RUNTIME) Target(ElementType.METHOD) Documented public interface Author String name(); String group(); 清单 2:Description.java /* * */ package com.magc.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 magc * * 定义描述信息 value */ Retention(RetentionPolicy.RUNTIME) Target(ElementType.TYPE) Documented public interface Description String value(); 清单 3:Utility.java package com.magc.annotation; Description(value = “这是一个有用的工具类“) public class Utility Author(name = “haoran_202“,group=“com.magc“) public String work() return “work over!“; 注:这是个普通的 Java 类,运行了Description 和Author 注解。 清单 3:AnalysisAnnotation.java package com.magc.annotation; import java.lang.reflect.Method; public class AnalysisAnnotation /* * 在运行时分析处理 annotation 类型的信息 * * */ public static void main(String args) try /通过运行时反射 API 获得 annotation 信息 Class rt_class = Class.forName(“com.magc.annotation.Utility“); Method methods = rt_class.getMethods(); boolean flag = rt_class.isAnnotationPresent(Description.class); if(flag) Description description = (Description)rt_class.getAnnotation(Description.class); System.out.println(“Utilitys Description- “+description.value(); for (Method method : methods) if(method.isAnnotationPresent(Author.class) Author author = (Author)method.getAnnotation(Author.class); System.out.println(“Utilitys Author- “+()+“ from “+author.group(); c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论