Java反射reflection与注解annotation的应用(自动测试机)
一.关于自动测试机
1.什么是自动测试机?
对类中的指定方法进行批量测试的工具
2.自动测试机有什么用?
a.避免了冗长的测试代码
当类中的成员方法很多时,对应的测试代码可能会很长,使用测试能够让测试代码非常简洁
b.降低了类与测试代码之间的耦合性
以防万一,测试时应该对类中所有方法进行测试。当我们对类中的一个方法做改动时,很可能我们的测试代码也要做相应改动(如改变了方法名,返回值类型等等),使用测试机能降低类与测试代码之间的耦合性,大大降低不必要的工作量。
c.增加了测试的灵活性
测试类与待测试类往往是分开的,设置测试参数时可能往往需要查看具体的方法体(寻找边界参数),这样很不方便。使用测试机的话,测试参数就在对应方法声明的位置(给方法添加相应注解),易于灵活修改参数。
3.测试机的原理
利用注解与反射就可以实现测试机了,原理非常简单,之前以为注解就是一种类型,没想过往这方面来应用...具体原理是:
根据待测试方法参数类型声明自定义注解 --> 为方法添加相应的注解 --> 利用反射机制编写测试机代码
二.参考资料
这么犀利的东西当然不是由我提出的,前辈在很久之前就提出了,链接:http://blog.csdn.net/rj042/article/details/6399965
P.S.建议把链接博文与本文一起看,原文介绍了很多相关的基础知识,本文是在其基础上展开的实践
三.实践
1.原文提出了自动测试机的问题:
-------
//定义一个类Methods,要求有三个方法Method1、2、3
//方法的参数、返回值类型均为String类型,返回值为传入的参数
//使用自定义的注解来注释Method1、3,并对属性参数赋值 public class Methods { /**
* @param args
*/
@Annotation("Param_1")//对Method1进行注解,表示自动测试机会对Method1感兴趣
public String Method1 (String s) {
//do something...like
s += "_X"; return s;
} //不对Method2进行注解,自动测试机将滤去Method2
public String Method2 (String s) {
//do something...like
s += "_XX"; return s;
} @Annotation("Param3")//同Method1
public String Method3 (String s) {
//do something...like
s += "_XXX"; return s;
} }
[自定义注解类 Annotation.java]
import java.lang.annotation.*; //定义一个单值注解Annotation,使其可以注解方法,并且可以被保留到程序运行时
//注解的属性类型为String,要求可以使用简写方式为属性赋值 @Target ({ElementType.METHOD})//声明该注解的作用对象,可以是多个Type值
@Retention (RetentionPolicy.RUNTIME)//声明该注解可以被保留到程序运行时
public @interface Annotation {
//此处定义的value既是属性也是方法,相当于"value", value这样的键值对
String value();
//没有成员的注解叫标记注解
//只有一个成员的注解叫单值注解
//有多个成员的注解叫多值注解
}
[测试类(自动测试机) TestAnnotation.java]
import java.lang.reflect.*; //定义一个测试类TestAnnotation,要求使用反射来测试Methods中所有的被Annotation注解的方法
//并将注解的属性值作为参数,调用相应方法来返回测试结果 public class TestAnnotation {
/*
* 这就是所谓的自动测试机
* 即用注解给定的值作为待测试方法的参数,对指定类中的所有方法进行批量测试
* 避免了冗长的测试代码
*
* */ @SuppressWarnings("rawtypes")
public static void main(String [] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, InvocationTargetException {
//利用反射机制根据类名获取类的实例,不同于一般的引用
//Class类的对象(实例、引用...)是普通对象的工厂
//也就是说对一个类A而言,A的class对象只有唯一的一个,而A的普通对象a1, a2, a3...可以有很多个
//new A() --> 判断是否存在A的Class对象,不存在则创建之,存在则继续 --> 根据Class对象创建普通对象
Class c = Class.forName("Methods"); //利用反射获取类中声明的所有方法
Method [] ms = c.getDeclaredMethods();
System.out.println("<自动测试机已启动...>\n");
for (Method m : ms) {
System.out.println("start{"); String name = m.getName();
//判断方法是否被注解了指定注解
if(m.isAnnotationPresent(Annotation.class)) {
System.out.println("正在测试 " + name + " 方法");
//获取注解对象
Annotation anno = m.getAnnotation(Annotation.class);
//获取注解的值,因为Annotation是单值注解,直接取值
String s = anno.value();
//获取类的实例
Object obj = c.newInstance();
System.out.println("传入参数为 " + s);
//调用m方法
Object returnObj = m.invoke(obj, s);
System.out.println("返回值为 " + returnObj);
System.out.println(name + " 方法测试完毕");
}
else
System.out.println(m.getName() + " 方法没有被注解,测试机跳过该方法"); System.out.println("}end\n");
} System.out.println("<...自动测试机已关闭>");
}
}
4.运行结果
<自动测试机已启动...>
start{
正在测试 Method1 方法
传入参数为 Param_1
返回值为 Param_1_X
Method1 方法测试完毕
}end
start{
Method2 方法没有被注解,测试机跳过该方法
}end
start{
正在测试 Method3 方法
传入参数为 Param3
返回值为 Param3_XXX
Method3 方法测试完毕
}end
<...自动测试机已关闭>
四.总结
例程序中只是为了说明测试机的原理,只能对特定类的特定方法进行测试,不过不用担心。
反射机制被誉为Java最让人兴奋的东西之一,绝对不是吹的。
反射机制允许通过子类来获取父类,并以此展开,最终可以得到清晰的类层次结构。
对多个类进行测试也很简单,我们只需要创建一个类名数组即可,循环什么的,计算机最喜欢做了。
当然,利用[反射 + 注解]来进行自动测试还有一个优点就是可以测试一个类的家族成员,父亲,爷爷...这一点是单纯的测试代码所无法想象的。
Java反射reflection与注解annotation的应用(自动测试机)的更多相关文章
- JAVA提高五:注解Annotation
今天我们学习JDK5.0中一个非常重要的特性,叫做注解.是现在非常流行的一种方式,可以说因为配置XML 比较麻烦或者比容易查找出错误,现在越来越多的框架开始支持注解方式,比如注明的Spring 框架, ...
- Java学习笔记:注解Annotation
annotation的概念 In the Java computer programming language, an annotation is a form of syntactic metada ...
- 公共技术点( Java 反射 Reflection)
转载路径:http://p.codekk.com/blogs/detail/5596953ed6459ae7934997c5 本文为 Android 开源项目源码解析 公共技术点中的 Java 反射 ...
- 公共技术点之 Java 反射 Reflection
本文摘录地址: http://codekk.com/open-source-project-analysis/detail/Android/Mr.Simple/%E5%85%AC%E5%85%B1%E ...
- Java自定义数据验证注解Annotation
本文转载自:https://www.jianshu.com/p/616924cd07e6 Java注解Annotation用起来很方便,也越来越流行,由于其简单.简练且易于使用等特点,很多开发工具都提 ...
- Java反射机制、注解及JPA实现
1.java反射概述 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称 ...
- Java反射与自定义注解
反射,在Java常用框架中屡见不鲜.它存在于java.lang.reflact包中,就我的认识,它可以拿到类的字段和方法,及构造方法,还可以生成对象实例等.对深入的机制我暂时还不了解,本篇文章着重在使 ...
- java 编程基础:注解(Annotation Processing Tool)注解处理器 利用注解解读类属性生成XML文件
APT的介绍: APT(Annotation Processing Tool)是一种注解处理工具,它对源代码文件进行检测,并找出源文件所包含的注解信息,然后针对注解信息进行额外的处理. 使用APT工具 ...
- 不藏了,这些Java反射用法总结都告诉你们
摘要:Java反射是一种非常强大的机制,它可以在同一个系统中去检测内部的类的字段.方法和构造函数.它非常多的Java框架中,都大量应用了反射技术,如Hibernate和Spring.可以说,反射机制的 ...
随机推荐
- LuoguP1032 字符变换(BFS)
题目链接为:https://www.luogu.org/problemnew/show/P1032 思路:看到数据比较小,而且最多有6个规则,就可以用搜索去做了,我用的BFS,大体思路如下: 定义结构 ...
- python之多线程队列
# 一共有以下3种队列# 1.先进先出# 2.后进先出# 3.存储数据的时候可设置优先级的队列,设置不同的优先级,取的时候按照优先级的顺序来取 下面介绍一下队列的方法,如果要使用队列,则需要导入一个模 ...
- 39. recover rotated sorted array恢复旋转排序数组
一句话思路:从左边开始的三步翻转法 一刷报错: 不理解start.end是位置随机定义的.i,j是临时变量,为start,end服务 nums.size()区别于nums.length:用于范形变量. ...
- 《Google软件测试之道》摘录
以下是最近看的一本书<Google软件测试之道>里的一些摘录,收获很多. 1.讨论测试开发比并没有什么意义,如果你是一名开发人员,同时也是一名测试人员,如果你的职位头衔上有测试的字样,你的 ...
- SSL - 简介
一.密码技术 要了解SSL协议,首先要了解:加密算法.消息摘要算法(又称为哈希算法Hash),数字签名等概念.这些技术每个都可以写出一整本的书,它们结合在一起,提供了保密性.完整性和身份验证的功能. ...
- Python使用wxPython、py2exe编写桌面程序-乾颐堂
Python是支持可视化编程,即编写gui程序,你可以用它来编写自己喜欢的桌面程序.使用wxPython来做界面非常的简单,只是不能像C#一样拖动控件,需要自行写代码布局.在完成编写之后,由于直接的p ...
- conn not captured
线程 和 事件中 变量 not captured 把变量定义为 static 或者添加为全局变量(放在main之前)
- vue cli+axios踩坑记录+拦截器使用,代理跨域proxy(更新)
16319 1.首先axios不支持vue.use()方式声明使用,看了所有近乎相同的axios文档都没有提到这一点建议方式 在main.js中如下声明使用 import axios from 'ax ...
- [转]docker 基本原理及快速入门
版权声明:原创作品, 来自海牛部落-青牛,http://hainiubl.com/topics/13 什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud ...
- 设计神器 - 摹客设计系统上线了 | 晒出你的设计规范,赢iPad Pro!
在国内,设计规范也许还是个不太常用的概念,但是如果你正好有参与互联网公司的产品设计,你应该早就已经体会到设计规范的重要性了.UI设计师总是要花费大量的时间和精力向开发描述一大堆设计细节,但是产品最后呈 ...