我正在使用 Drools,并且我将很多全局变量插入到KieSession.kieSession.setGlobal("foo", foo);kieSession.setGlobal("bar", bar);kieSession.setGlobal("baz", baz);//...我用作全局对象的每个对象都作为 Spring bean 存在,因此我突然想到,如果我有一个预期的全局变量列表,我可以简单地“自动装配”会话。Map<String, Class<?>> globals = getGlobals(kieSession);globals.forEach((name, clazz) -> kieSession.setGlobal(name, beanFactory.getBean(clazz)));有一个方法被调用getGlobals,但它似乎只返回已经插入的全局变量。通过附加调试器,我可以看到这些值的映射存在于内部KieBase,我编写了一个方法来通过反射获取它:@SuppressWarnings("unchecked")@SneakyThrows //Lombok turns the checked exceptions into uncheckedprivate Map<String, Class<?>> getGlobals(final KieSession session){ final KieBase kieBase = session.getKieBase(); final Field globals = kieBase.getClass().getDeclaredField("globals"); globals.setAccessible(true); return (Map<String, Class<?>>) globals.get(kieBase);}这可行,但除非绝对必要,否则我宁愿不诉诸反思。有没有更好的方法来实现这一点?如果没有,是否有充分的理由封装这些信息以使我通常无法访问它?
1 回答
忽然笑
TA贡献1806条经验 获得超5个赞
您可以从KiePackage. 只需迭代从 KieBase 获得的 KiePackages。
final Collection<KiePackage> kiePackages = kieSession.getKieBase().getKiePackages();
for (KiePackage kiePackage : kiePackages)
{
final Collection<Global> globalVariables = kiePackage.getGlobalVariables();
//...
}
添加回答
举报
0/150
提交
取消
