代码之家  ›  专栏  ›  技术社区  ›  Tyvain

是否可以使用自定义注释来处理此问题?

  •  0
  • Tyvain  · 技术社区  · 6 年前

    class Rule1 implements IRule{
        doSomethingMethod () {}
    }
    
    class Rule2 implements IRule{
        doSomethingMethod () {}
    }
    ...
    
    class Engine1 () {
        Rule1.doSomething();
        Rule2.doSomething();
    }
    
    class Engine2 () {
        Rule3.doSomething();
        Rule99.doSomething();
        Rule5.doSomething();
    }
    

    我想用自定义注释来编写代码,因为我的目标是统计哪些引擎调用哪些规则,我认为这将更容易:

    public @Interface Rule (){
        class Rule rule;
    }
    
    class Engine1 () {
        @Rule(Rule1.class);
        @Rule(Rule2.class);
    }
    
    class Engine2 () {
        @Rule(Rule3.class);
        @Rule(Rule99.class);
        @Rule(Rule5.class);
    }
    

    然后我可以用org.springframework.context环境.annotation.ClassPathScanningCandidateCom使统计更容易。

    这可能吗(怎么可能?)? 这是好办法吗?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Dean Xu    6 年前

    是的,这是可能的。

    您可以定义 @Rule 注释

      @Target(ElementType.TYPE)
      @Retention(RetentionPolicy.RUNTIME)
      public @interface Rule {
        Class<? extends IRule>[] rule();
      }
    

    EngineeX

      @Rule(rule = { Rule1.class, Rule2.class })
      public static class Enginee1 {
      }
    
      @Rule(rule = { Rule2.class, Rule3.class })
      public static class Enginee2 {
      }
    

    然后我们扫描这个类,看看是否有 . 如果是,加载它们。

    public static void load(Class<?> engineeClass) {
      Rule rule = engineeClass.getAnnotation(Rule.class);
      if (rule != null) {
        for (Class<? extends IRule> clz : rule.rule()) {
          try {
            IRule r = clz.newInstance();
            r.run();
          } catch (Exception e) {
            e.printStackTrace();
          }
        }
      }
    }
    

    如果你想让它们像静态块一样自动加载。有几种方法。

    1. 添加静态块 load(EngineeX.class) 发动机
    2. Spring
    3. 使用时手动加载发动机