Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从java访问规则的结果(RHS)?_Java_Drools - Fatal编程技术网

如何从java访问规则的结果(RHS)?

如何从java访问规则的结果(RHS)?,java,drools,Java,Drools,我有以下结构的规则: rule "ins b" when A() then B $b = new B(); $b.setName("hello"); insert($b); end 我想获取规则添加到工作内存中的对象(及其属性)。 我可以使用以下代码获取LHS对象: RuleImpl ri = (RuleImpl) kSession.getKieBase().getRule("com.sample", "ins b"); System.out.println(

我有以下结构的规则:

rule "ins b"
when
    A()
then 
    B $b = new B();
    $b.setName("hello");
    insert($b);
end
我想获取规则添加到工作内存中的对象(及其属性)。
我可以使用以下代码获取LHS对象:

RuleImpl ri = (RuleImpl) kSession.getKieBase().getRule("com.sample", "ins b");
System.out.println("L: " + ri.getLhs());
Pattern rce = (Pattern) ri.getLhs().getChildren().get( 0 );
System.out.println("L: " + rce.getConstraints());
但我找不到类似的东西来获取规则的RHS

我想这样做是因为我试图根据规则“自动”生成查询。 根据上述规则,我想生成如下内容:

query howToGetA() 
  @Abductive( target = A.class ) 
  $b := B( name == "hello" ) 
end

提前谢谢。

为什么要这样做?您“知道”在编写规则代码时插入的对象

您可以通过呼叫获取RHS

RuleImpl ri = ...
Consequence cons = ri.getConsequence();
然而,我不认为这会给你“规则添加到工作记忆中的对象(及其属性)”。结果是代码(以某种形式),并且您在代码中找不到对象,因为对象是在运行时生成的


此外,RuleImpl(以及接口结果及其实现)都是非公共API的一部分,可能会在不另行通知的情况下进行更改。

可能值得指出的是,可以实现侦听器,以查看插入规则时插入的对象。分析规则可能插入的对象似乎只与自己实现规则引擎的人相关。特别是考虑到规则可能会调用Java类上的方法,而Java类本身会执行插入…@Steve Gratten-可以指出更多,但是在规范中?这就是为什么我以“为什么”开头。@laune关于RuleImpl你是对的;Eclipse甚至给出了一个警告“不鼓励访问:类型'RuleImpl'不是API…”,但我想不出其他方法来实现基于规则的查询生成。感谢您的宝贵意见,很抱歉一开始我没有更清楚地提出这个问题。@Steve正如您所指出的,使用侦听器,我可以在触发规则时获取插入的对象,但我希望在不触发规则的情况下提取信息。也许,我将不得不解析drl文件…不幸的是,到目前为止,RHS是一个“黑匣子”。它被解析为Java字符串,动态编译并执行。我们一直在讨论“@Logical”规则,现在Drools 7有一个受限的RHS语法和一些预定义的语义,我建议在规则上使用一个注释来声明它断言的类的类型,并一致地允许该规则的RHS只是实例化和插入该对象的实例