是否可以使用自定义注释来进行此操作?

时间:2018-07-03 01:50:54

标签: java spring annotations

这是我的代码(简化但有效),它是一个计算引擎,可以通过按特定顺序应用规则进行试验:

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 个答案:

答案 0 :(得分:0)

是的,有可能。

您可以定义@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 {
  }

然后,我们扫描班级以查找是否存在@Rule。如果是,请加载它们。

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)类上添加静态块EngineeX
  2. 如果您有一个高级容器,例如Spring。您可以在类加载后确定加载过程的状态。
  3. 使用引擎时手动加载引擎
  4. 使用自定义类加载器并在加载后加载引擎

答案 1 :(得分:-1)

我想到两种方法

我假设Rule“ X” .doSomething()是类中的方法定义,对吗?如果没有,请编辑您的源代码以更好地了解您的需求。