Я запускаю следующий код (в консоли сценариев Jenkins):
def sayHello() {
println "Hello"
}
class MyClass {
MyClass() {
sayHello()
}
}
def a = new MyClass()
Честно говоря, я ожидаю, что код конструктора вызовет функцию, которая напечатает Hello
.
Вместо этого я получаю
groovy.lang.MissingMethodException: No signature of method: MyClass.sayHello() is applicable for argument types: () values: []
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:58)
Что здесь происходит? Я не могу вызвать функцию внутри класса?
Не уверен, что и почему вы пытаетесь сделать, но самый простой способ вызвать «функцию» из конструктора внутри скрипта — поместить ее в другой класс:
class A {
static sayHello() {
println "Hello"
}
}
class MyClass {
MyClass() {
A.sayHello()
}
}
def a = new MyClass()
Вы получаете сообщение об ошибке, потому что вы не можете получить доступ к методам одного класса из другого класса, если вы не получаете доступ к экземпляру этого класса. В вашем случае код автоматически встраивается в метод run() внутри класса Main, производного от groovy.lang.Script. Класс MyClass является внутренним классом класса Main. Смотрите здесь Скрипты против классов.
Решение: чтобы получить доступ к методу sayHello() класса Main, вы должны передать его экземпляр, используя ключевое слово this
:
def sayHello() {
println "Hello"
}
class MyClass {
MyClass(Script host) {
host.sayHello()
}
}
def a = new MyClass(this)