Java练习(十七):编写代码,设计三个注解@StartTag, @EndTag @MyTag, 实现类似于junit4的@Before, @After, @Test功能

目录

1. 编码要求

2. 示例代码

2.1 注解类(自定义):StartTag.java, EndTag.java, MyTag.java

2.2 测试类:TestTag.java

2.3 入口类:MyDemo.java


1. 编码要求

(1)编写代码,设计三个注解@StartTag, @EndTag, @MyTag, 实现类似于junit4的@Before, @After, @Test功能

(2)运用到注解的定义,反射,模板方法等知识点。

2. 示例代码

2.1 注解类(自定义):StartTag.java, EndTag.java, MyTag.java

(1)StartTag.java

package MyStartAndEndTag;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface StartTag {
}

(2)EndTag.java

package MyStartAndEndTag;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface EndTag {
}

(3)MyTag.java

package MyStartAndEndTag;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyTag {
}

2.2 测试类:TestTag.java

package MyStartAndEndTag;

public class TestTag {

    @StartTag
    public void start(){
        System.out.println("before the testing...");
    }

    @EndTag
    public void end(){
        System.out.println("after the testing...");
    }

    @MyTag
    public void test1(){
        System.out.println("test1");
    }

    @MyTag
    public void test2(String p_str){
        System.out.println("test2");
    }

    @MyTag
    public void test3(){
        System.out.println("test3");
    }
}

​​​​​​​2.3 入口类:MyDemo.java

package MyStartAndEndTag;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MyDemo {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {

        Class<?> clazz = Class.forName("MyStartAndEndTag.TestTag");
        Object obj = clazz.getDeclaredConstructor().newInstance();
        Method[] methods = clazz.getDeclaredMethods(); //获取声明的所有方法,数组存放

        int start = -1;
        int end = -1;

        for (int i=0; i<methods.length; i++){
            if(methods[i].getAnnotation(StartTag.class) != null && methods[i].getParameterCount() == 0){
                start = i;  //找出带有StartTag标签的方法是第几个
                break;
            }
        }

        for (int i=0; i<methods.length; i++){
            if(methods[i].getAnnotation(EndTag.class) != null && methods[i].getParameterCount() == 0){
                end = i;   //找出带有EndTag标签的方法是第几个
                break;
            }
        }

        //System.out.println("start: " + start);
        //System.out.println("end: " + end);

        for(int i=0; i<methods.length; i++){
            if (methods[i].getAnnotation(MyTag.class) != null && methods[i].getParameterCount() == 0 ){
                System.out.println("测试用例名称为: " + methods[i].getName());

                //模板方法在用例之前执行
                if(start != -1){
                    methods[start].invoke(obj);
                }

                //执行用例
                methods[i].invoke(obj);

                //模板方法在用例之后执行
                if(end != -1){
                    methods[end].invoke(obj);
                }
            }
        }
    }
}

输出结果:

测试用例名称为: test3
before the testing...
test3
after the testing...
测试用例名称为: test1
before the testing...
test1
after the testing...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值