Java反射reflection与注解annotation的应用(自动测试机)(二)

2014-11-23 19:21:30 · 作者: · 浏览: 39
/
@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.运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<自动测试机已启动...>
start{
正在测试 Method1 方法
传入参数为 Param_1
返回值为 Param_1_X
Method1 方法测试完毕
}end
start{
Method2 方法没有被注解,测试机跳过该方法
}end
start{
正在测试 Method3 方法
传入参数为 Param3
返回值为 Param3_XXX
Method3 方法测试完毕
}end
<...自动测试机已关闭>
四.总结
例程序中只是为了说明测试机的原理,只能对特定类的特定方法进行测试,不过不用担心。
反射机制被誉为 Java最让人兴奋的东西之一,绝对不是吹的。
反射机制允许通过子类来获取父类,并以此展开,最终可以得到清晰的类层次结构。
对多个类进行测试也很简单,我们只需要创建一个类名数组即可,循环什么的,计算机最喜欢做了。
当然,利用[反射 + 注解]来进行自动测试还有一个优点就是可以测试一个类的家族成员,父亲,爷爷...这一点是单纯的测试代码所无法想象的。