2015-07-09 8 views
0

У меня есть Groovy script, который позволяет пользователю определять некоторые динамические свойства и методы, а затем выполняет пользовательское закрытие. Сценарий будет выглядеть следующим образом:Groovy - Код проверки кода закрытия перед выполнением

// init properties and methods dynamically at runtime 
context.prop1 = "Some test value" 
context.method1 = { String input -> 
    "exec " + input.toUpperCase() 
} 

// "this" is set to the context variable from above 
run { 
    println method1(prop1) 
} 

Таким образом, в начале сценария, context инициализируется с заданным пользователем свойств (например, prop1) и методами (например, method1). Затем контекст используется как указатель в закрытии запуска. Я достиг этого, динамически расширяя мета-класс контекста и устанавливая контекст как делегат закрытия запуска (с помощью стратегии DELEGATE_FIRST в качестве стратегии разрешения).

В настоящее время я боюсь Тип проверки. Перед выполнением закрытия запуска я хотел бы проверить, действительно ли method1 ожидает prop1. Я просмотрел аннотацию DelegatesTo, но это не работает для динамически расширенных объектов. Я также играл с АСТ, но поскольку мои знания по этой теме ограничены, я не нашел решения. Если то, что я хочу достичь, возможно, любые указатели в правильном направлении были бы весьма признательны.

ответ

1

Вы хотите добавить метод в контекст во время выполнения, а затем введите check this перед выполнением этого метода.

Проверка типов производится во время компиляции. Это прежде чем что-либо из вашей программы будет выполнено. Обычно нет шансов, что это может когда-либо проверить что-либо, что произойдет только во время выполнения, если у вас нет способа статически объявить его и дать компилятору возможность выполнить проверку. Но это обычно означает, что вам придется делать статическую компиляцию.

Одним из способов было бы использовать type checking extensions, но я думаю, что в вашем случае это может быть излишним. Более простым способом было бы использовать extension modules. И самым простым способом было бы использовать custom script base class.

Но для любого из этих решений вам понадобится статическая компиляция, чтобы действительно иметь проверку типов, то же самое для DelegatesTo (которая больше используется в комбинации с модулями расширения). Для проверяемого типа DSL соединение расширений типа и модулей расширения может работать очень хорошо. Но вы, конечно, потеряете более динамичные черты языка и некоторую простоту.

Смежные вопросы