1 Junit中的@Test为例:

   1.1 用注解(@Test)前

private boolean isTestMethod(Method m) {
return
m.getParameterTypes().length == 0 &&
m.getName().startsWith("test") &&
m.getReturnType().equals(Void.TYPE);
}

  用注解前(Junit4之前),Junit一般通过类似与上面的代码来获取一个测试类中的测试方法,通过反射获取到方法对象,然后再判断,其逻辑本质上是看一个测试方法应该为:以test开头、无参数、无返回值。

  1.2 用注解(@Test)后

@Test
public void testName() throws Exception {
}

这里@Test的主要作用是标注testName这个方法为一个测试方法,起标注作用,可以算是一个marker annotation。和上面一样,为@Test标注的方法一样得是公有的、无参数、无返回值的,违反这两条规则,则会出现编译错误。

  1.2.1 获取测试方法流程

  1. 首先,获取待测试类所对应的Class对象
  2. 然后就可以获取其中的所有public方法所对应的Method数组。
  3. 遍历Method对象,获取每个Method对象
  4. 通过调用isAnnotationPresent(Test.class)方法,可以检查方法是否有名为Test的注解,
  5. 如果有这个注解,则为测试方法,调用Method对象的invoke()方法来执行这个方法。
for (Method method : Foo.class.getDeclaredMethods()) {
if (method.isAnnotationPresent(org.junit.Test.class)) {
System.out.println("Method " + method + " has junit @Test annotation.");
}
}

1.2.2 @Test的定义:    

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Test { /**
* Default empty exception
*/
static class None extends Throwable {
private static final long serialVersionUID = 1L; private None() {
}
} /**
* Optionally specify <code>expected</code>, a Throwable, to cause a test method to succeed iff
* an exception of the specified class is thrown by the method.
*/
Class<? extends Throwable> expected() default None.class; /**
* Optionally specify <code>timeout</code> in milliseconds to cause a test method to fail if it
* takes longer than that number of milliseconds.
*/
long timeout() default 0L;
}

  先忽略其他细节不谈,@interface, 类似于Java中的class、enum、interface等。这个关键字声明隐含了一个信息:它是继承了java.lang.annotation.Annotation接口,并非声明了一个interface

  里面声明了两个成员:

  • expected,用于验证测试方法是否抛出预期的异常
  • timeout, 用于验证测试方法是否能在指定的时间内运行完。

元注解

  java中元注解用来修饰注解的,自定义注解的时候可能用得到。大致有如下几种:

  1. @Document 表示这个注解或出现在使用它的目标位置对应的文档中。
  2. @Retention 保留策略
  3. @Target 注解适用目标
  4. @Inherited 默认情况下父类某个地方使用了一个注解,不会被继承到子类对应的地方,如果在注解上加上@Inherited,就会被继承到子类。

注解保留策略

  如上面的@Retention(RetentionPolicy.RUNTIME)表示该注解会在运行时被保留,其中@Retention为元注解,元注解的作用就是负责注解其他注解。@Retention在这里控制了该注解的保留策略,可选值为:       

  1. SOURC在源代码中有效
  2. CLASS:在class文件中有效(即class保留,默认
  3. RUNTIME:在运行时有效(即运行时保留)

    注解适用范围

  @Target({ElementType.METHOD}) 表示该注解适用于方法,可选值有:

  1. TYPE, /** Field declaration (includes enum constants) */
  2. FIELD, /** Method declaration */
  3. METHOD, /** Parameter declaration */
  4. PARAMETER, /** Constructor declaration */
  5. CONSTRUCTOR, /** Local variable declaration */
  6. LOCAL_VARIABLE, /** Annotation type declaration */
  7. ANNOTATION_TYPE, /** Package declaration */
  8. PACKAGE

注解作用

  1. 生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等
  2. 跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量。
  3. 在编译时进行格式检查。如@Override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。

其他基本内置注释

  @Override 注释能实现编译时检查,你可以为你的方法添加该注释,以声明该方法是用于覆盖父类中的方法。如果该方法不是覆盖父类的方法,将会在编译时报错。例如我们为某类重写toString()方法却写成了tostring(),并且我们为该方法添加了@Override注释;

  @Deprecated 的作用是对不应该在使用的方法添加注释,当编程人员使用这些方法时,将会在编译时显示提示信息,它与javadoc里的@deprecated标记有相同的功能,准确的说,它还不如javadoc @deprecated,因为它不支持参数,

  @SuppressWarnings 与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数值都是已经定义好了的,我们选择性的使用就好了,参数如下:

站在巨人的肩膀上,参考资料:

http://www.blogjava.net/mlh123caoer/archive/2007/09/06/143260.html

http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html

http://www.cnblogs.com/mandroid/archive/2011/07/18/2109829.html

http://www.cnblogs.com/mandroid/archive/2011/07/18/2109829.html

http://www.cnblogs.com/phoebus0501/archive/2011/02/21/1960077.html

Java 注解(Annoation)学习笔记的更多相关文章

  1. Java注解Annotation学习笔记

    一.自定义注解 1. 使用关键字 @interface 2. 默认情况下,注解可以修饰 类.方法.接口等. 3. 如下为一个基本的注解例子: //注解中的成员变量非常像定义接口 public @int ...

  2. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  3. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  4. 《深入理解Java虚拟机》学习笔记

    <深入理解Java虚拟机>学习笔记 一.走近Java JDK(Java Development Kit):包含Java程序设计语言,Java虚拟机,JavaAPI,是用于支持 Java 程 ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. Java多线程技术学习笔记(二)

    目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ...

  7. Java安全防御学习笔记V1.0

    Java安全防御学习笔记V1.0http://www.docin.com/p-766808938.html

  8. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  9. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

随机推荐

  1. ES6相关特性(let & const)

    [ecma-262/8.0]http://www.ecma-international.org/ecma-262/8.0/index.html 1.Let & const let 的三个特性: ...

  2. 同步软件UltraCompare 64位 软件及注册机

    软件及注册机下载: https://share.weiyun.com/f09e6243887e374ead1b3a3ab8f611a9 软件官方下载地址:  https://www.ultraedit ...

  3. webpack了解

    一.理解webpack 什么是webpack? 是一个模块打包器.它的主要目标是将 JavaScript 文件打包在一起,打包后的文件用于在浏览器中使用,但它也能够胜任转换(transform).打包 ...

  4. cesium 实现路径漫游功能

    功能:路径漫游. 详细:绘制多个路径,删除路径,漫游路径选择,路径漫游. ①绘制路径 ②保存路径 ③路径切换 ④路径漫游 ⑤路径删除 ⑥删除完成

  5. SVN建立分支、代码合并以及常用操作

    在项目开发的过程中,现在遇到这样一个问题: 现在是9月份,在同一个项目中我要开发A.B两个模块,A模块是11月份上线,B模块是12月份上线,但是SVN上的trunk(主干)上的代码必须是上线的. 假设 ...

  6. android+nutz后台如何上传和下载图片

    android+nutz后台如何上传和下载图片  发布于 588天前  作者 yummy222  428 次浏览  复制  上一个帖子  下一个帖子  标签: 无 最近在做一个基于android的ap ...

  7. 【翻译】Emmet(Zen Coding)官方文档 之六 自定义 Emmet

    [说明]本系列博文是依据 Emmet 官方文档翻译的,原文地址为:http://docs.emmet.io/,部分内容已经在博主之前的博文中节选过,为方便已经收藏过之前博文的朋友,没有删除这些博文,仅 ...

  8. 内置函数SQLCODE和SQLERRM的使用

    由于ORACLE的错信息最大长度是512字节,为了得到完整的错误提示信息,我们可用 SQLERRM 和 SUBSTR 函数一起得到错误提示信息,方便进行错误,特别是如果WHEN OTHERS异常处理器 ...

  9. 基于 win7下虚拟机的 GNSS-SDR安装过程

    最近在安装 GNSS-SDR软件时,遇到了很多问题,这里回顾了我的安装过程,罗列了所遇到的问题和解决办法.希望后来者不要再踩这些坑了! 首先,在官方文档中看到,GNSS-SDR目前并不支持直接在 Wi ...

  10. MappingException:class com.zsn.crm.Model.user not found whie looking for property user id

    之前好好地运行 什么东西都没动过 再次运行突然报异常*****MappingException:class com.zsn.crm.Model.user not found whie looking ...