`
wutheringsea
  • 浏览: 258642 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

[转] Java注释@interface的用法

    博客分类:
  • Java
阅读更多


@interface是用来自定义JAVA Annotation的语法,普通的开发人员可能很少用到它,但是它的功能很强大,本文将具体介绍@interface的用法!
@interface是用来自定义注释类型的,如果你不了解Java注释,可以参阅上一篇文章:"JDK5.0注释(Annotation)的用法"。
一般的应用程序开发人员可能从不需要定义一个注释类型,但定义我们自己的注释类型并不复杂。注释类型的定义跟定义一个接口相似,我们需要在 interface这个关键字前面加上一个@符号,即@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 Foo


  Test 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

  虽然这个测试工具只是一个玩具,但他显示了注释的强大的功能。

 

来源:http://keriny.iteye.com/blog/842437

 

分享到:
评论
1 楼 zhao_tuo 2016-09-13  
总结的不错

相关推荐

    Java注释@interface的用法

    java用 @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类。 @Override,@Deprecated,@SuppressWarnings为常见的3个注解。 注解相当于一种标记,在程序中加上了注解就等于为程序加上了某种标记...

    JPA 和 注释文档

    JPA(Java persistent api) 是sun 公司持久层标准,它用注释来维持类和表的对应关系: 注意:注释跟类、接口、枚举 是同一级别 使用:@注释名(注释属性名=与注释属性类型对应的值) 注释定义: @Target({ElementType....

    \java超强笔记(超级经典)

    静态方法可以是泛型方法(在修饰符和返回值之间写泛型),但是不可以使用类的泛型。 static void copyArrayToList(Object[] os,List<T> ls){ //错误,T为类的泛型 } static <E> void ...

    漂移:基于注释的Java库,用于创建Thrift可序列化的类型和服务

    Drift是一个易于使用的基于注释的Java库,用于创建Thrift客户端和可序列化的类型。 客户端库类似于JAX-RS(HTTP Rest),而序列化库类似于JaxB(XML)和Jackson(JSON),但适用于Thrift。 例子 以下接口定义了...

    java8集合源码-java8:java8

    如果使用注释@FunctionalInterface 用多个方法注释一个接口,则 Runnable、Comparator 编译时错误 默认方法:为了向后兼容 接口女性 { 默认无效 sayHello() { System.out.println("Hiiiiiieeee"); } } interface ...

    WorizonJsonRpc:基于 HTTP 的 JSON-RPC 2.0 的 Java 库

    要使用代理 api,模拟远程服务的 Java 接口必须被注释为@Remote 。 代理 api 使用一组注释来调整 json 请求的表示以满足您的编组需求。 您可以在下面找到代理 api 的几个示例及其相关注释: @Remote public ...

    java高级之注解

    java高级之注解 注解的概念: 注解是JDK1.5的新特性。 注解相当一种标记,是类的组成部分,可以给类携带一些额外的信息。 注解可以加在包,类,字段,方法,方法参数以及局部变量上。 注解是给编译器看的,编译器...

    java代码自动生成源码-AutoInterface:自动生成Java接口源代码

    java代码自动生成源码AutoInterface-Java注释处理器 根据带注释的类文件的公共方法生成Java接口。 为类或接口生成Decorator接口 好处 只有一个实现时,无需手动维护接口 帮助诸如Spring之类的框架进行依赖注入 ...

    Enterprise JavaBean (EJB) 是可重用的、可移植的 J2EE 组件。EJB 由封装业务逻辑的方法组成。譬如说,EJB 可能有这样的业务逻辑:

    客户往购物车里面添加商品或者从里面删除商品、下订单等时调用的其他方法也可以使用这些详细信息。不过,有状态的会话bean是暂时性的,因为出现会话终止、系统崩溃或者网络故障后,状态不复存在。客户端请求有状态的...

    自动委托:Java注释处理器,用于将接口API自动委派给该接口的组合实例

    自动委托 Java注释处理器,用于将接口API自动委派给该接口的组合实例。 该项目的灵感来自Google的项目,并利用了公开的实用程序。用法要求: JDK 11或以上dependencies { compileOnly( " com.ryandens " , " auto-...

    Hibernate注释大全收藏

    Hibernate注释大全收藏 声明实体Bean @Entity public class Flight implements Serializable { Long id; @Id public Long getId() { return id; } public void setId(Long id) { this.id = id; } } @Entity ...

    java面试宝典

    128、在JSP中如何使用注释? 32 129、在JSP中如何执行浏览重定向? 32 130、如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE中? 32 131、在JSP中如何设置COOKIE? 32 132、在JSP中如何删除一个COOKIE? 32 133、...

    java8集合源码-core-java:核心-java

    java8集合源码核心Java学习与实验 Java 8 特性 Java流: 参考: 要对数据源的元素执行一系列操作并聚合它们的结果,需要三个部分 - 源、中间操作和终端操作。 中间操作返回一个新的...注释以避免添加多个抽象方法,在

    整理后java开发全套达内学习笔记(含练习)

    Overload [java] 方法的重载(不同参数列表的同名方法) [,әuvә'lәud] Override [java] 方法的覆盖(覆盖父类的方法) [,әuvә'raid] polymiorphism[java] 多态 (polymorphism 多形性[,pɒli'mɒ:fizm]) ...

    java8stream源码-java8-tutorial:这个项目fork来自[java8-tutorial](https://github.

    在简短的代码示例的支持下,您将学习如何使用默认接口方法、lambda 表达式、方法引用和可重复注释。 在文章的最后,您将熟悉最新的变化,如流、功能接口、地图扩展和新的 Date API。 没有文字墙,只有一堆带注释的...

    java8集合源码-java-8-learning:在学习Java8中引入的新概念时使用的代码存储库

    使用@FunctionalInterface注释。 ::带有方法的符号使引用静态方法、对象方法、构造函数成为可能。 ::new允许引用正在访问的类的构造函数。 可以在没有final键盘的情况下访问 lambda 表达式范围之外的局部变量。 但是...

    java8stream源码-test:测试

    1936):创建函数的方法,数学逻辑中的形式系统,用于表达基于函数抽象的计算以及使用变量绑定和替换的应用。 编程语言中的新东西? 自 1958 年 Lisp 以来就有了 Lambda 句法 阴影 与本地类和匿名类不同,lambda ...

    Dagger2Example

    Dagger2示例Android Dagger 2 如何在Android中使用Dagger 2 依赖注入是一种将配置过程(对象创建)与其用法分开的方法。 使用方面(例如,活动,片段,视图)在此处获得您需要的对象(只需使用@Inject注释),不要在...

    autoproxy:注释处理库。 在interfaceabstract类的顶部生成代理类,该代理类可拦截呼叫。 也称为设计模式

    1.自动代理 注释处理库。 在interface / abstract类的顶部生成代理类,该代理类可拦截呼叫。 也称为设计模式:代理,委托,拦截器。 UML代理模式: 4.1。 配置依赖关系4.2。 制定代理类规范4.3。 项目中的用法(又名...

    Java-Web程序设计题库.doc

    B、getServerInfo() C、getServletPath() D、getServerPort() 17、能够获取当前页信息并调用页面方法的对象就是( B ) A、request B、page C、PageContext D、session 18、以下操作中,( A )就是与使用JavaBean无关的...

Global site tag (gtag.js) - Google Analytics