我正在使用 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)));有一個方法被調(diào)用getGlobals,但它似乎只返回已經(jīng)插入的全局變量。通過附加調(diào)試器,我可以看到這些值的映射存在于內(nèi)部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);}這可行,但除非絕對必要,否則我寧愿不訴諸反思。有沒有更好的方法來實現(xiàn)這一點?如果沒有,是否有充分的理由封裝這些信息以使我通常無法訪問它?
1 回答

忽然笑
TA貢獻1806條經(jīng)驗 獲得超5個贊
您可以從KiePackage. 只需迭代從 KieBase 獲得的 KiePackages。
final Collection<KiePackage> kiePackages = kieSession.getKieBase().getKiePackages();
for (KiePackage kiePackage : kiePackages)
{
final Collection<Global> globalVariables = kiePackage.getGlobalVariables();
//...
}
添加回答
舉報
0/150
提交
取消