1

次のクラスがあるとしましょう。

class Person {
    int age;
    String city;
    Collection<Person> friends;
    Person spouse;
}

特定のPersonオブジェクトで論理式が真であるかどうかを評価できるライブラリが必要です。式は次のようになります。

((age>25 OR spouse.age>27) AND city=="New-York" AND size(friends)>100)

したがって、要件は次のとおりです。

  1. 基本的な論理演算子を使用する機能
  2. 指定されたオブジェクトのプロパティにアクセスします
  3. 内部オブジェクトのプロパティにアクセスする
  4. size、max、sumなどの単純な数学\SQLのような関数を使用する

提案?

4

2 に答える 2

4

ScriptEngine +リフレクションを使用できます。

以下を出力する不自然な例を次に示します。

age = 35
city = "London"
age > 32 && city == "London" => true
age > 32 && city == "Paris" => false
age < 32 && city == "London" => false

コレクションなどの非プリミティブ型を処理する場合は、かなり厄介になる可能性があります。

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;
    }
}
于 2012-10-02T13:43:36.157 に答える
4

OK、私が欲しいものを見つけたと思います。それはアシリアの答えのバリエーションですが、より標準化されているので私はそれを好みます(特にJavascript式に依存したり、Javascriptを実行したりしたくない)。

どうやら、式を評価するための統一式言語があり、元々はJSP用に設計されていましたが、他のものにも使用できます。パーサーの実装はいくつかありますが、おそらくSpringELまたはJUELのいずれかを使用ます

于 2012-10-03T10:38:02.230 に答える