似乎Java没有像我之前在C ++中所做的那样(没有什么大惊喜)。我有一套从另一个应用程序生成的规则(一系列if-then检查)。这些规则会不时发生变化,因此在C ++中我会这样做:
double variableForRules=1;
bool condition=false;
#include "rules.out";
if(condition) //do something
本质上,rules.out中的if-then检查将使用“variableForRules”(以及其他几个变量)来决定是否应将条件设置为true。如果在规则评估之后将其设置为true,则程序会执行某些操作。
在Java中有类似的方法吗?或者是我唯一选择使用rules.out实际上是一个需要实例化的整个类等等?
谢谢!
答案 0 :(得分:7)
由于您正在自动生成rules.out,因此您也可以自动生成Java函数。希望添加该功能并不会太痛苦。
答案 1 :(得分:3)
由于Java中没有预处理器,因此无法执行此操作。就像你说的那样,你必须在一个类中实现你的逻辑。
答案 2 :(得分:1)
也许您可以使用脚本来实现。您可以查看Java Scripting Programmer's guide。
答案 3 :(得分:1)
在Java中,其他应用程序通常会将规则保存到.xml或.properties文件中,然后在该文件中读取Java。
答案 4 :(得分:1)
rules.out实际上必须是一个需要为要执行的代码实例化的整个类。
由于rules.out是由第三方应用程序生成的,最好的办法是编写自己的CppToJavaTransformer
读取文件rules.out
作为输入并生成Rules.java
。这假定rules.out
在编译时可用,并且Rules.java
将在编译时使用。缺点是需要进行额外的转换。
或者,您可以编写解释rules.out的代码并使用内省执行所需的指令。这很难,但rules.out也可以在运行时更改。
答案 5 :(得分:0)
即使可以包含规则文件,也没有任何帮助。正如你所说,你的规则是动态的。看起来你的java代码需要针对不同的场景进行更改。
答案 6 :(得分:0)
您可以尝试使用reflection(请参阅:创建新对象和按名称调用方法)
首先以您当前构建rules.out并编译它的方式生成Rules.java。
然后在运行时以传统方式加载JDBC驱动程序的方式将类文件加载到应用程序中。
Class clazz = Class.forName("com.mydomain.Rules");
如果您的应用程序运行很长一段时间(比单个Rules.class文件的生命周期长),那么您必须创建自己的ClassLoader,以便在单个运行时期间交换基础类。