Как напечатать экземпляр некоторого класса в разделяемой библиотеке jenkins без явного вызова метода toString () - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть общая библиотека jenkins.У него есть некоторый CustomClass.groovy с переопределенным методом toString ():

package com.jenkins

class CustomClass {

    CustomClass(){
    }

    @Override
    String toString() {
        return "custom_class"
    }
}

И у меня есть Jenkinsfile:

@Library("sharedlib@to-string")
import com.jenkins.CustomClass

println("1")
println(new CustomClass())

println("2")
println("prefix: " + new CustomClass())

println("3")
println("prefix: " + new CustomClass().toString())

Он производит следующий вывод:

[Pipeline] echo
1
[Pipeline] echo
2
[Pipeline] echo
custom_class
[Pipeline] echo
3
[Pipeline] echo
prefix: custom_class
[Pipeline] End of Pipeline
Finished: SUCCESS

У меня есть некоторая путаница с этим выводом:

  1. Почему первый пример ничего не печатал?
  2. Почему первый пример не печатал префикс?Почему только экземпляр?
  3. Почему второй и третий примеры различны?Почему здесь я вижу префикс, но не вижу его во втором примере.Почему в первом примере ничего не напечатано, а в третьем все в порядке, как и ожидалось.В конце концов, метод println () неявно использует toString () во втором примере.

1 Ответ

0 голосов
/ 30 декабря 2018

в соответствии с Pipeline Readme: -)

Обратите внимание, в частности, что @Override методов, определенных в двоичных классах, таких как Object.toString(), должны вообщепомечены @NonCPS, поскольку их обычно вызывает двоичный код.

следующее будет работать правильно:

class A{
    @NonCPS
    @Override
    public String toString(){
        return "A[123]"
    }
}

node {
    def a = new A()
    echo('1 >>>')
    echo(message: "Hello ${a}")
    echo('2 >>>')
    echo(message: "Hello " + a)
    echo('3 >>>')
    echo(message: "Hello " + a.toString())
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...