Привязка скрипта не работает до вызова Script.run () - PullRequest
0 голосов
/ 23 января 2019

У меня есть следующий тестовый код, чтобы выяснить, как работает привязка переменных.Это то, что я хочу импортировать / включить;

# importee.groovy
import groovy.transform.Field

@Field top = 60
number = 44 // binding variable
int ratio = 4.5

return this

, откуда я его называю;

# importer.groovy (version1)
import groovy.lang.GroovyClassLoader

def gcl = new GroovyClassLoader()                                           
def clazz = gcl.parseClass(new File("importee.groovy"))    )
assert clazz.name == 'importee' 
def script = clazz.newInstance()   
//script.run()
println("binding variable: 
${script.getBinding().getVariable("number")}")

Итак, если я не запускаю скрипт, мой тестовый код выдает«MissingPropertyException» в последнем операторе печати.Этого не произойдет, если я вызову def script = evaluate(new File("importee.groovy")) вместо использования GroovyClassLoader как здесь;

# importer.groovy (version2)
def script = evaluate(new File("importee.groovy"))
println("binding/global variable: ${script.number}")

Поскольку оба метода возвращают экземпляр Script, я немного запутался, почему мне нужно вызыватьrun() метод в первом случае.Может кто-нибудь объяснить, где я не понимаю, пожалуйста?

Спасибо

1 Ответ

0 голосов
/ 23 января 2019

run groovyconsole (распространяется с groovy)

введите простой скрипт:

number=44
return this

выберите меню Script -> Inspect Ast

и в новом окне Groovy AST Browser выберите phase = Conversion

вы увидите свой Groovy скрипт, но преобразованный в класс Script, подобный следующему:

public class script1548245785832 extends groovy.lang.Script { 
    public script1548245785832() {
    }

    public java.lang.Object run() {
        number = 44
        return this 
    }
}

это фактический код, сгенерированный для вашего скрипта.

Как видите, конструктор пуст, поэтому никакой информации о свойстве number после вызова newInstance()

, но после вызова run() вы фактически запускаете свой скрипт.


ваш скрипт может быть таким классом:

class Importee {
    int number=44
    public Object run(){
        println number
    }
}

, в этом случае будет достаточно создать экземпляр класса без вызова метода run() и получить значение переменной числа...

def clazz = gcl.parseClass( new File("Importee.groovy")) )
def script = clazz.newInstance()   

println("the variable: ${script.number}")
...