注解——一些不懂的地方

注解

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyTest {
}
public class MyTestFunction {
   public static void main(String[] args) throws Exception {
       Class<JunitTest01> c = JunitTest01.class;
       Method[] ms = c.getDeclaredMethods();
       for (Method m : ms) {
           //得到所有注解 装到数组里面
           Annotation[] annos = m.getDeclaredAnnotations();
           //对所有注解遍历
           for (Annotation anno : annos) {
               //判断是否为注解
               if(anno instanceof MyTest){
                   m.invoke(c.newInstance());
              }
          }
      }
  }
}
public class Test01 {
   @MyTest
   public void run(){
       System.out.println("不说了、开冲!!!");
  }

   @MyTest
   public void sleep(){
       System.out.println("好困啊好想睡.....");
  }

   @MyTest
   public void talk(){
       System.out.println("你说啥说啥???");
  }
}

注解的作用

  1. 如果需要有功能,我们得结合反射去写功能。

  2. 需求:

    1. 定义注解:用在方法上,能批量执行被标记的所有方法。相当于Test批量测试。

    2. 功能执行被标记得方法,

  3. 实现思路:

    1. 查找测试类中哪个方法用到了该注解

      1. 反射获取类中有哪些方法。

      2. 遍历方法,获取方法上的所有注解。

      3. 判断,是该注解 instanceof

      4. 如果是,invoke

我们可以通过反射判断方法是否标有我们的@MyTest注解,这样我们就可以只运行带有特定注解的方法。

不过写完上面的代码之后,我在想,我们很多时候写方法,里面都会带一些参数,而通过上面的方法调用带注解方法时,我们无法针对参数的个数不同从而对症下药,所以我们应该可以通过反射获取参数的个数以及参数的形式,再通过循环之类的方法,利用注解调用方法。

其实我也不确定可不可行,emmm试试看主要是,算是记录一下情况吧。

对注解的尝试

public class Test01 {
   @MyTest
   public void run(){
       System.out.println("不说了、开冲!!!");
  }

   @MyTest
   public void sleep(){
       System.out.println("好困啊好想睡.....");
  }

   @MyTest
   public void talk(String name){
       System.out.println(name+"在说啥说啥???");
  }

   @MyTest
   public void count(int num){
       System.out.println("总共有"+num+"个");
  }

   @MyTest02
   public void work(){
       System.out.println("在工作.....");
  }
}
public class MyTestFunction {
   public static void main(String[] args) throws Exception {
       Class<Test01> c = Test01.class;
       Method[] ms = c.getDeclaredMethods();
       for (Method m : ms) {
           //得到所有注解 装到数组里面
           Annotation[] annos = m.getDeclaredAnnotations();
           //对所有注解遍历
           for (Annotation anno : annos) {
               //判断是否为注解
               if (anno instanceof MyTest) {
                   Type[] pgt = m.getGenericParameterTypes();
                   for (Type type : pgt) {
                       System.out.println(type);
//                       System.out.println(type.getTypeName());
//                       m.invoke(c.newInstance());
                  }
              }
          }
      }
  }
}

大概是弄成了这个样子,通过输出type跟type.getTypeName(),可以发现输出的正是我@MyTest注解方法的参数类型,按理讲之后应该是由于不确定参数个数所以加个循环,不确定每个方法的参数类型所以加判断,不过一时间发现好像无法判断一个值是否是String类型,是否是int类型,其实原本是想跟注解一样用instancof,不过好像不行,突然就尬住了,虽然能输出参数类型但不知道如何判断参数类型,以后有机会再想想吧,感觉越想越麻烦了。

单元测试

标一个单元测试进来,总感觉以后会不太记得

单元测试属于程序员的自测。一般用在增删改查数据的测试上。

  1. 导包junit4.jar,第三方写的。

  2. 写一个测试类功能模块区分,UserTest

  3. 写一个测试方法,testAdd()

    1. public void testXxxxx(){}

    2. 公有权限,没有返回值,无参。

  4. 在方法上加Test注解。

public class Demo01 {

   @Before
   public void before() {
       System.out.println("初始化资源,加载配置文件");
  }

   @After
   public void after() {
       System.out.println("释放资源");
  }

   @Test
   public void test01() {
       System.out.println("呵呵呵。。。。");
       // 结果: 绿色,成功 红色,失败
  }

   @Test
   public void test02() {
       System.out.println("么么哒。。。。");
       // 结果: 绿色,成功 红色,失败
  }
}

 

posted @ 2021-12-06 20:04  Black空我  阅读(34)  评论(0)    收藏  举报