Хотя это не стандартная практика, мне любопытно, можно ли вводить методы в контекст компиляции GroovyShell
.Могу ли я добавлять методы в базовый скрипт Groovy динамически с Java?
Идея заключается в том, чтобы иметь что-то вроде (в Java):
GroovyShell shell = new GroovyShell();
Script script = shell.parse("test()");
script.run();
Где я хотел бы динамически добавлять методы, которые invokable, где test()
было включено.
Я немного экспериментировал с беспорядком с Script
metaClass
, но я не вижу способа фактически манипулировать metaClass
с Java. В частности, вызов script.getMetaClass().getMethods().add(...)
вызывает исключение UnsupportedOperationException.
По сути, я бы хотел определить точки вызова DSL, которые вызывают методы Java, а не Groovy-based. Я готов написать эту часть в Groovy (и знаю, как это сделать), но мне действительно интересно, является ли это жизнеспособным альтернативным подходом, или, если это не так, то, что такое подводные камни.
Вкратце: как я могу динамически определить метод, о котором знает GroovyShell
?
Привет, я тоже застрял в аналогичной проблеме. Вы отправили здесь: http://stackoverflow.com/questions/27315115/groovy-dsl-with-java, но я все еще размещаю этот комментарий здесь, выдвигая проблему, застрявшую с в надежде, что вы предложите некоторую помощь. Я хочу передать имя класса (Java) и его имя метода в DSL. И я хочу иметь экземпляр, созданный для этого класса, и данный метод, вызванный из Groovy. Но так как я получаю класс, прошедший как «класс xx.class-name», я не могу создать его экземпляр и выполнить требуемый вызов метода. Не могли бы вы дать здесь небольшое руководство? Благодарю. – 5122014009
Из Java можно сделать 'binding.setProperty (« wishMethodName », новый MethodClosure (myObject,« myMethod »));'. Единственная проблема заключается в том, что существующие методы не могут быть перезаписаны. Спасибо, что указали этот вариант. – akostadinov