package test;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import com.espertech.esper.common.client.annotation.Name;
abstract class Rule{
public String ruleName="";
public abstract boolean check();
}
public class RuleContainer {
Double param1;
Double param2;
public class Rule1 extends Rule {
public Rule1() {
//ruleName="Rule1";
}
public boolean check() {
return param1<0.1*param2;
}
}
@SuppressWarnings("rawtypes")
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
Class clazz = test.RuleContainer.class;
RuleContainer ruleContainer = (RuleContainer) clazz.newInstance();
//Constructor[] rule1Cons = test.RuleContainer.Rule1.class.getConstructors();
Constructor[] rule1Cons = Class.forName("test.RuleContainer$Rule1").getConstructors();
Constructor rule1Con = rule1Cons[0];
// 关键是这一行代码 内部类的构造函数默认需要外部类的引用作为参数
Rule rule1 = (Rule) rule1Con.newInstance(ruleContainer);
HashMap<String, Rule> ruleMap = new HashMap<String, Rule>();
ruleMap.put("rule1", rule1);
boolean safe = ruleContainer.allRuleInMapCheck(ruleMap);
System.out.println(safe);
}
}
参考:https://blog.youkuaiyun.com/ldstartnow/article/details/52782420