Я не уверен, что вы имеете в виду относительно объявленных классов, не существующих между evals, следующие два сценария работают, как и ожидалось, при уклонении один за другим:
class C {{println 'hi'}}
new C()
...
new C()
Однако методы становятся связанными с классом, который их объявил, и GroovyShell создает новый класс для каждого экземпляра. Если вам не нужно возвращаемое значение какого-либо из сценариев, и они действительно являются сценариями (не классами с основными методами), вы можете прикрепить следующее в конец каждого оцененного сценария.
Class klass = this.getClass()
this.getMetaClass().getMethods().each {
if (it.declaringClass.cachedClass == klass) {
binding[it.name] = this.&"$it.name"
}
}
Если вы зависите от возвращаемого значения, вы можете вручную управлять оценкой и запускать сценарий как часть вашего анализа (предупреждение, непроверенный код приведен ниже, только для иллюстративного использования) ...
String scriptText = ...
Script script = shell.parse(scriptText)
def returnValue = script.run()
Class klass = script.getClass()
script.getMetaClass().getMethods().each {
if (it.declaringClass.cachedClass == klass) {
shell.context[it.name] = this.&"$it.name"
}
}
// do whatever with returnValue...
Есть одно последнее предостережение, которое, я уверен, вы знаете. Статически типизированные переменные не хранятся между evals, поскольку они не сохраняются в привязке. Таким образом, в предыдущем скрипте переменная 'klass' не будет храниться между вызовами скрипта и исчезнет. Чтобы исправить это, просто удалите объявления типов при первом использовании всех переменных, это означает, что они будут прочитаны и записаны в привязку.