美文网首页
Java编程思想(十九) 注解

Java编程思想(十九) 注解

作者: kaiker | 来源:发表于2022-07-03 15:43 被阅读0次
    • Java内置三种注解:
    1. @Override 表示当前的方法定义将覆盖超类中的方法。
    2. @Deprecated 如果使用了注解为它的元素,编译器会发出警告信息。
    3. @ SuppressWarnings 关闭不当的编译器警告信息。

    1、基本语法

    定义注解

    • 注解会编译成class文件。
    • 元注解@Target定义注解用在什么地方;@Rectetion用来定义该注解在哪一个级别可用。
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Test {} ///:~
    

    元注解

    元注解

    2、编写注解处理器

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface UseCase {
      public int id();
      public String description() default "no description";
    } ///:~
    
    public class UseCaseTracker {
      public static void
      trackUseCases(List<Integer> useCases, Class<?> cl) {
        for(Method m : cl.getDeclaredMethods()) {
          UseCase uc = m.getAnnotation(UseCase.class);
          if(uc != null) {
            System.out.println("Found Use Case:" + uc.id() +
              " " + uc.description());
            useCases.remove(new Integer(uc.id()));
          }
        }
        for(int i : useCases) {
          System.out.println("Warning: Missing use case-" + i);
        }
      }
      public static void main(String[] args) {
        List<Integer> useCases = new ArrayList<Integer>();
        Collections.addAll(useCases, 47, 48, 49, 50);
        trackUseCases(useCases, PasswordUtils.class);
      }
    } /* Output:
    Found Use Case:47 Passwords must contain at least one numeric
    Found Use Case:48 no description
    Found Use Case:49 New passwords can't equal previously used ones
    Warning: Missing use case-50
    *///:~
    

    3、基于注解的单元测试

    • 基于注解的测试框架叫做@Unit
    public class AtUnitExample1 {
      public String methodOne() {
        return "This is methodOne";
      }
      public int methodTwo() {
        System.out.println("This is methodTwo");
        return 2;
      }
      @Test boolean methodOneTest() {
        return methodOne().equals("This is methodOne");
      }
      @Test boolean m2() { return methodTwo() == 2; }
      @Test private boolean m3() { return true; }
      // Shows output for failure:
      @Test boolean failureTest() { return false; }
      @Test boolean anotherDisappointment() { return false; }
      public static void main(String[] args) throws Exception {
        OSExecute.command(
          "java net.mindview.atunit.AtUnit AtUnitExample1");
      }
    } /* Output:
    annotations.AtUnitExample1
      . methodOneTest
      . m2 This is methodTwo
    
      . m3
      . failureTest (failed)
      . anotherDisappointment (failed)
    (5 tests)
    
    >>> 2 FAILURES <<<
      annotations.AtUnitExample1: failureTest
      annotations.AtUnitExample1: anotherDisappointment
    *///:~
    
    • 对每个单元测试而言,@Unit都会用默认构造器,为测试所属的类创建出一个新的实例。并在此创建的对象上运行测试,然后丢弃该对象。
    • 如果没有默认构造器,可以创建一个static方法专门构造对象,然后用@TestObjectCreate进行标记。

    相关文章

      网友评论

          本文标题:Java编程思想(十九) 注解

          本文链接:https://www.haomeiwen.com/subject/zanlbrtx.html