这是我的代码(简化但有效),它是一个计算引擎,可以通过按特定顺序应用规则进行试验:
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进行扫描,以使统计更加容易。
这可能吗? 这是个好方法吗? 我还有另一种方法吗?
答案 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();
}
}
}
}
如果您希望它们像静态块一样自动加载。有服务器方法。
load(EngineeX.class)
类上添加静态块EngineeX
Spring
。您可以在类加载后确定加载过程的状态。答案 1 :(得分:-1)
我想到两种方法
我假设Rule“ X” .doSomething()是类中的方法定义,对吗?如果没有,请编辑您的源代码以更好地了解您的需求。