gpt4 book ai didi

java - 如何获取 KieSession 所需的所有全局变量?

转载 作者:行者123 更新时间:2023-12-02 01:40:20 25 4
gpt4 key购买 nike

我正在使用 Drools,并且将相当多的全局变量插入到 KieSession 中。

kieSession.setGlobal("foo", foo);
kieSession.setGlobal("bar", bar);
kieSession.setGlobal("baz", baz);
//...

我用作全局的每个对象都作为 Spring bean 存在,因此我想到,如果我有一个预期全局变量的列表,我可以简单地“ Autowiring ” session 。

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

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

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

最佳答案

您可以从 KiePackage 获取全局变量。只需迭代从 KieBase 获取的 KiePackages 即可。

final Collection<KiePackage> kiePackages = kieSession.getKieBase().getKiePackages();
for (KiePackage kiePackage : kiePackages)
{
final Collection<Global> globalVariables = kiePackage.getGlobalVariables();
//...
}

关于java - 如何获取 KieSession 所需的所有全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54534633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com