使用$class定义访问对象属性

x759pob2  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(347)

让我们有一个对象:

def scm = [
            $class: 'GitSCM', 
            branches: branches,
            userRemoteConfigs: 
                [ [ credentialsId: credentialsId, url: repoUrl, name: remote, refspec: refspecs ] ],
            extensions: [
                [$class: 'RelativeTargetDirectory', relativeTargetDir: (args.path ? args.path : args.repository.name) ],
                [$class: 'CloneOption', honorRefspec: true, noTags: true, reference: '', shallow: false, timeout: 30],
                [$class: 'ScmName', name: args.repository.name]
            ]
        ]

我想检查 timeout 从…起 CloneOption .
我尝试了以下方法,但没有成功:

script.println(scm.extensions[[CloneOption.timeout]])
...
gxwragnw

gxwragnw1#

一种方法是:




scm.extensions.find { it.'$class' ==  'CloneOption' }?.timeout

因为 scm.extensions 是一个 List ,我们使用 find 要从中取出一个与闭包内的条件匹配的元素。。。在闭包中,我们询问哪个元素具有属性 $class 谁的价值是 CloneOption . find 返回与条件匹配的一个元素,或 null ,以便访问 timeout 我们使用空安全运算符: ?.timeout .
您可以更进一步,向Map(对象的类型)添加一个帮助器方法,使您可以更轻松地从它或它的“扩展”访问属性:




Map.metaClass.getProp = { String name ->
    if (containsKey(name)) return get(name)
    extensions.find { e -> e."$name" != null }?."$name"
}

现在,你可以使用 getProp 为实现这一目标:

println "Class of scm is ${scm.getProp('$class')}"
println "Timeout value is ${scm.getProp('timeout')}"

将打印:

Class of scm is GitSCM
Timeout value is 30

相关问题