Выполнение Groovy кода в Java во время выполнения - PullRequest
3 голосов
/ 22 июня 2010

Возможно ли выполнение Groovy кода, динамически загруженного в Java-приложении. Например, есть таблица базы данных, которая содержит небольшие фрагменты кода, например:

def test(${val_to_insert_from_java}){
    if (${val_to_insert_from_java} > 10){
        return true;
    }
    return false;
}

Где ${val_to_insert_from_java} - это заполнитель для некоторого реального значения, которое будет вставлено во время выполнения кода Java, например:

String groovyFuncSource = getFromDb();
groovyFuncSource.replace(${val_to_insert_from_java}, 9);
Object result = <evaluate somehow groovyFuncSource>;

Есть ли способ оценить такой фрагмент кода Groovy? Или, может быть, вы посоветуете мне другой подход, как это реализовать.

Ответы [ 4 ]

10 голосов
/ 22 июня 2010

Да, вы можете сделать это.

см. Ссылку http://groovy.codehaus.org/Embedding+Groovy

Возможно, вы захотите соблюдать осторожность при таком подходе, потому что выполнение кода, хранящегося в базе данных, приведет к недостаткам безопасности в вашем приложении. Например, некоторый код, злонамеренно вставленный как текст в вашу базу данных, может сделать ... почти все, если вы не проверяете его.

4 голосов
/ 22 июня 2010

Альтернативой может быть использование JavaScript вместо Groovy.Зачем?Поскольку движок Rhino JavaScript уже поставляется с JDK .Так что, если вы еще не используете Groovy в своих проектах, это еще одна зависимость.

2 голосов
/ 22 июня 2010

В Java 6 вы можете использовать Java Scripting API для этого. API сценариев Java позволяет использовать различные языки сценариев в приложениях Java.

Подробнее о Java Scripting можно узнать здесь .

1 голос
/ 22 июня 2010

Да, вы можете использовать механизм сценариев Groovy для оценки исходного кода Groovy во время выполнения - и, конечно, этот исходный код может быть результатом замены строк.

Из того, что я помню, есть разные способы сделать это, которые будут иметь разные плюсы и минусы.

См. Главу 11 Groovy в действии для получения более подробной информации.

...