`

JDK5.0中注释(Annotation)的用法

    博客分类:
  • J2EE
阅读更多
很多api都需要相当数量的样板代码,比如,为了编写一个jax-rpc的web服务,你需要提供一个接口和一个实现类。如果这个程序已经被加了注释annotations以说明那个方法需要被远程调用,那么我们可以一个工具去自动生成这些样板代码。

还有一些api需要在程序代码另外维护一些文件,比如javabean需要一个beaninfo类,ejb需要一个部署描述文件。如果我们能够把这些需要另外维护的文件内容以注释annotation的方式和代码放在一起维护,一定会更加方便同时也减少出错的机会。

java平台已经有了一些特别的注释的机制。比如transient修饰符就是一个特别的注释,表明这个字段应该被序列化子系统忽略;@deprecated javadoc标签是一个特别的标签来说明某个方法已经不再被使用了。jdk5.0提供了一个让我们自己定义我们自己注释的功能,这个功能包含了如何定义注释类型的语法,声明注释的语法,读取注释的api,一个类文件保存注释(译者注:注释可以被看作一个类,我们需要用一个.java文件保存我们自己定义的注释源码)和一个注释处理的工具。

注释并不影响代码的语义,但却影响用于处理包含有注释的程序代码的工具的处理方式,使他们(工具)能够影响运行状态的程序的语义。注释可以从源代码中读取,从编译后的.class文件中读取,也可以通过反射机制在运行时读取。

注释是javadoc标签的补充。一般情况下,如果我们的主要目标是影响或者产生文档,那么我们应该使用javadoc;否则,我们应该使用注释annotations。

一般的应用程序开发人员可能从不需要定义一个注释类型,但定义我们自己的注释类型并不复杂。注释类型的定义跟定义一个接口相似,我们需要在interface这个关键字前面加上一个@符号。注释中的每一个方法定义了这个注释类型的一个元素,注释中方法的声明中一定不能包含参数,也不能抛出异常;方法的返回值被限制为简单类型、string、class、emnus、注释,和这些类型的数组。方法可以有一个缺省值。这里是一个注释类型定义的例子:

/**
* describes the request-for-enhancement(rfe) that led
* to the presence of the annotated api element.
*/
public @interface requestforenhancement {
    int    id();
    string synopsis();
    string engineer() default "[unassigned]"; 
    string date();    default "[unimplemented]"; 
}


一旦定义好了一个注释类型,你就可以用来作注释声明。注释一中特殊的修饰符,在其他修饰符(比如public,static,或者final等)使用地方都可以使用。按照惯例,注释应该放在其他修饰符的前面。注释的声明用@符号后面跟上这个注释类型的名字,再后面跟上括号,括号中列出这个注释中元素/方法的key-value对。值必须是常量。这里是一个例子,使用上面定义的注释类型:

@RequestForEnhancement(    id       = 2868724,    synopsis = "Enable time-travel",    engineer = "Mr. Peabody",    date     = "4/1/3007")public static void travelThroughTime(Date destination) { ... }


没有元素/方法的注释被成为标记(marker)注释类型,例如
/** * Indicates that the specification of the annotated API element * is preliminary and subject to change. */public @interface Preliminary { }

标记注释在使用的时候,其后面的括号可以省略,例如:
@Preliminary public class TimeTravel { ... }

如果注释中仅包含一个元素,这个元素的名字应该为value,例如:
/** * Associates a copyright notice with the annotated API element. */ public @interface Copyright { String value(); }

如果元素的名字为value,使用这个注释的时候,元素的名字和等号可以省略,如:@Copyright("2002 Yoyodyne Propulsion Systems") public class OscillationOverthruster { ... }为了将上面提到的东西结合在一起,我们创建了一个简单的基于注释的测试框架。首先我们需要一个标记注释类型用以说明一个方法是一个测试方法,并被测试工具执行。
import java.lang.annotation.*; /** * Indicates that the annotated method is a test method. * This annotation should be used only on parameterless static methods. */@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface Test { }
 

我们可以注意到这个注释类型本省也被注释了,这种注释叫做元注释。第一注释(@Retention(RetentionPolicy.RUNTIME))表示这种类型的注释被VM保留从而使其能够通过反射在运行时读取;第二个注释@Target(ElementType.METHOD)表示这种注释只能用来注释方法。

下面是一个简单的类,其中的几个方法被加了上面的注释:
public class Foo {    @Test public static void m1() { }    public static void m2() { }    @Test public static void m3() {        throw new RuntimeException("Boom");    }    public static void m4() { }    @Test public static void m5() { }    public static void m6() { }    @Test public static void m7() {        throw new RuntimeException("Crash");    }    public static void m8() { }}
 

这里是测试工具:
import java.lang.reflect.*; public class RunTests {   public static void main(String[] args) throws Exception {      int passed = 0, failed = 0;      for (Method m : Class.forName(args[0]).getMethods()) {         if (m.isAnnotationPresent(Test.class)) {            try {               m.invoke(null);               passed++;            } catch (Throwable ex) {               System.out.printf("Test %s failed: %s %n", m, ex.getCause());               failed++;            }         }      }      System.out.printf("Passed: %d, Failed %d%n", passed, failed);   }}

这个工具用一个类名作为参数,遍历这个类中的所有方法,并调用其中被加了@Test注释的方法。如果一个方法抛出了一个异常,那么这个测试就失败了,最终的测试结果被打印了出来。下面是程序运行的结果:
$ java RunTests FooTest public static void Foo.m3() failed: java.lang.RuntimeException: Boom Test public static void Foo.m7() failed: java.lang.RuntimeException: Crash Passed: 2, Failed 2

分享到:
评论

相关推荐

    全面解析Java注解

     我们有必要对JDK 5.0新增的注解(Annotation)技术进行简单的学习,因为Spring 支持@AspectJ,而@AspectJ本身是基于JDK 5.0的注解技术。所以学习JDK 5.0的注解知识有助于我们更好地理解和掌握Spring的AOP技术。 ...

    Java基础加强Java基础加强

    本文主要探讨了Java的基础知识以及在JDK 5.0中引入的一些新特性,旨在帮助开发者强化Java编程技能。 首先,Eclipse是Java开发中常用的集成开发环境(IDE),它提供了丰富的功能来支持开发过程。工作空间(workspace...

    java Annotation 注解

    Java Annotation,也称为注解,是Java编程语言中的一种元数据机制,自JDK 5.0开始引入。注解提供了在源代码中嵌入元数据的能力,这些元数据可以被编译器、构建工具或者运行时环境用来处理代码。它们在代码中看起来...

    maven-annotation-plugin:一个Maven插件,可在编译时处理来自jdk6及更高版本的注释

    该插件有助于从Maven使用JDK8提供的集成在Java编译器中的新注释处理 该插件是Maven apt插件的“ alter ego” 文献资料 相关插件 插入 信息 Jboss的eclipse插件 eclipse插件 开发注释处理器 发行版 日期 版本 信息 ...

    java高级特性,涵盖了多种java常用的一些例子

    Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。 Java 语言中的类、方法、变量、参数和包等都可以被标注。Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节...

    jdk1.5 tiger java5 新特性

    JDK 1.5,代号“Tiger”,也被称为Java 5.0,引入了一系列重大的语言和库改进,显著提升了开发效率和代码质量。本文将深入探讨这些新特性,分享实际应用中的经验和技巧。 首先,让我们从增强的for循环开始。这种新...

    Java基础加强1.pdf

    这里我们将深入探讨Eclipse IDE的使用,JDK 5.0引入的新特性,以及如何有效地利用它们进行更高效的编程。 Eclipse是一款强大的集成开发环境(IDE),广泛用于Java EE开发。它提供了诸如代码自动完成、错误检测、...

    北京圣思园 Annotation pdf文档

    根据给定的文件信息,我们将介绍Java注解(Annotation)的相关知识点,包括其定义、使用方法、内建注解以及高级特性。 首先,我们来看看Java注解的由来。在Java 5.0版本发布之前,程序员通常需要使用注释(Comments...

    Java版水果管理系统源码-huihe_2020summer:2020假期spring学习,vue留给你们了,有兴趣自己可以看官方文档,中文很

    JDK5.0 引入的一种注释机制。 Java 语言中的类、方法、变量、参数和包等都可以被标注。 内置的注解 作用在代码的注解是 @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,...

    105-Java核心编程14.docx

    在Java编程中,注解(Annotation)是一种强大的工具,自JDK 5.0引入以来,它极大地简化了代码管理和元数据的处理。注解不同于注释,它是代码的一部分,可以在编译、运行时被解析和执行特定的处理。本文将深入探讨...

    java注解详解,十分有用。

    Java 注解(Annotation)是 JDK 5.0 及以后版本引入的一个特性,它是一个新的类型,与类、接口、枚举是在同一个层次。注解可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释...

    14、JavaSE:注解和反射.pdf

    Java注解(Annotation)是自JDK 5.0版本起引入的一种元数据,它为程序提供了附加信息,但并不直接影响程序的运行。注解的主要目的是为了帮助编译器、构建工具、IDE或其他软件工具更好地理解和处理代码。注解与普通的...

    吴天雄-Java注解及动态性详解.doc

    Java注解,也称为Annotation,是自JDK 5.0版本起引入的一种元数据机制,它为程序提供了额外的信息,这些信息可以在编译时或运行时被解析和使用。元数据是描述数据的数据,注解就是一种特殊的数据类型,可以用于修饰...

    注解与反射高效开发法.pdf

    Java注解在JDK 5.0版本被引入,它允许开发者为程序元素(如类、方法、变量等)添加注释信息,而这些信息将被编译器或者其他工具使用。注解通过使用@interface关键字来声明。元注解是用于注解注解的注解,常见的元...

    Java JDK实例宝典

    全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...

    java高级.docx

    在Java编程语言中,标注(Annotation)是一项重要的特性,自JDK 5.0引入以来,极大地丰富了Java的元数据处理能力。与传统的注释不同,标注不仅用于提供描述性信息,更重要的是它们能够被编译器或运行时环境所识别并...

    java注解详解[文].pdf

    Java 注解(Annotation)是 JDK 5.0 及以后版本引入的一个特性。它是一个新的类型,与接口类似,位于同一个层次,称为 Java 的一个类型(TYPE)。注解可以声明在包、类、字段、方法、局部变量、方法参数等的前面,...

Global site tag (gtag.js) - Google Analytics