猿问

如何获得 KieSession 所需的所有全局变量?

我正在使用 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 unchecked

private 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);

}

这可行,但除非绝对必要,否则我宁愿不诉诸反思。


有没有更好的方法来实现这一点?如果没有,是否有充分的理由封装这些信息以使我通常无法访问它?


qq_笑_17
浏览 251回答 1
1回答

忽然笑

您可以从KiePackage. 只需迭代从 KieBase 获得的 KiePackages。final Collection<KiePackage> kiePackages = kieSession.getKieBase().getKiePackages();for (KiePackage kiePackage : kiePackages){&nbsp; &nbsp; final Collection<Global> globalVariables = kiePackage.getGlobalVariables();&nbsp; &nbsp; //...}
随时随地看视频慕课网APP

相关分类

Java
我要回答