1.自定义注解
/**
* 声明了自定义注解
* 定义其“特殊含义”为 单元测试功能。
*Retention:作用是组件的传播范围,取值RUNTIME时候
* 注解将传播到“运行期间”。默认值为:SOURCE
* Target:注解的可标注位置。METHOD:方法
* 默认值是任意位置,都可以标注
*
* @Retention 和 @Target 其“特殊意义”由JAVA编译器负责处理解析。
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface requestMapping{
public String value();
}
-
测试
public class HelloController {
@requestMapping(value = “/hello.do”)
public String hello(){
return “Hello”;
}
}
3.相关反射
* 动态加载类TestCase,利于反射API,获取
* 类中声明的全部方法信息,然后在方法上
* 获得标注的注解信息。证明Test注解传播
* 到了“运行期间”
String className="demo.TestCase";
//动态加载类
Class cls=Class.forName(className);
//查找类上声明的全部方法信息
Method[] methods=cls.getDeclaredMethods();
for(Method method:methods){
/*查找在方法中标注的注解(Annotation)信息
这个方法返回Annotation数组,表示返回
在方法上标注的多个注解。
如果没有注解则返回空数组*/
System.out.println("方法:"+method);
/*查找方法上指定@Test的直接,返回值
* 如果找到,则返回@Test注解的“注解类型”对象,
* 如果没有找到,则返回null。在实际编程时候
* 经常检查这个方法返回值是否为null,如果不为null
* 就表示找到注解了!
*/
Test test=method.getAnnotation(Test.class);
//检查是否包含@Test注解
Annotation[] anns=method.getAnnotations();
if(test!=null){
//在method方法上找到注解
System.out.println(method+"包含"+test);
}
for(Annotation ann:anns){
System.out.println(ann);
}
- JUnit4的“原型”
public class JUnit4 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
/**
* JUnit4的“原型”
* 1.动态加载被测试对象
* 2.动态创建测试对象
* 3.动态查找测试类中标注了@Test注解的测试方法
* 4.利用反射在对象上调用测试方法
*
*通过如上代码解析@Test注解,为注解实现其“特殊功能”,就是自动执行标注了@Test的方法
*/
Scanner scan=new Scanner(System.in);
System.out.println(“输入测试类名:”);
String className=scan.nextLine();
Class cls=Class.forName(className);
//利用反射API动态创建cls类型的实例
Object obj=cls.newInstance();//创建对象
//找到所有方法
Method[] methods=cls.getDeclaredMethods();
for(Method method:methods){
//查找包含@Test注解的方法
Test test=method.getAnnotation(Test.class);
if(test!=null){
//在method上找到@Test注解
//利用反射调用对象的方法
method.invoke(obj);
}