Ale*_*lex 4 java expression evaluate
假设我有以下课程:
class Person {
int age;
String city;
Collection<Person> friends;
Person spouse;
}
Run Code Online (Sandbox Code Playgroud)
我需要一个库,它允许我评估给定 Person 对象上的逻辑表达式是否为真。表达式看起来像这样:
((age>25 OR spouse.age>27) AND city=="New-York" AND size(friends)>100)
Run Code Online (Sandbox Code Playgroud)
所以,要求是:
建议?
您可以使用ScriptEngine + 反射:
这是一个输出的人为示例:
age = 35
city = "London"
age > 32 && city == "London" => true
age > 32 && city == "Paris" => false
age < 32 && city == "London" => false
Run Code Online (Sandbox Code Playgroud)
如果您想处理非原始类型(例如集合),它可能会变得非常混乱。
public class Test1 {
public static void main(String[] args) throws Exception{
Person p = new Person();
p.age = 35;
p.city = "London";
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
Class<Person> c = Person.class;
for (Field f : c.getDeclaredFields()) {
Object o = f.get(p);
String assignement = null;
if (o instanceof String) {
assignement = f.getName() + " = \"" + String.valueOf(o) + "\"";
} else {
assignement = f.getName() + " = " + String.valueOf(o);
}
engine.eval(assignement);
System.out.println(assignement);
}
String condition = "age > 32 && city == \"London\"";
System.out.println(condition + " => " + engine.eval(condition));
condition = "age > 32 && city == \"Paris\"";
System.out.println(condition + " => " + engine.eval(condition));
condition = "age < 32 && city == \"London\"";
System.out.println(condition + " => " + engine.eval(condition));
}
public static class Person {
int age;
String city;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6175 次 |
| 最近记录: |