Я использую Drools и вставляю довольно много глобалов в KieSession
.
kieSession.setGlobal("foo", foo);
kieSession.setGlobal("bar", bar);
kieSession.setGlobal("baz", baz);
//...
Каждый объект, который я использую как глобальный, существует как bean-компонент Spring, и поэтому происходитмне, что если бы у меня был список ожидаемых глобальных переменных, я мог бы просто «автоматически связать» сессию.вставлен.
После присоединения отладчика я вижу, что карта этих значений существует внутри 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);
}
Этоработает, но я бы предпочел не прибегать к рефлексии, если это не является абсолютно необходимым.
Есть ли лучший способ сделать это?Если нет, есть ли веская причина, по которой эта информация инкапсулирована, чтобы я не мог получить к ней обычный доступ?