我正在使用 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
忽然笑
随时随地看视频慕课网APP
相关分类