是否可以禁用 属性 语法来访问 groovy 中的 getter?

Possibility to disable the property syntax for accessing a getter in groovy?

让我有一个 groovy class 比如:

class SomeClass {
    String myProperty = 'foo'
}

通常在 groovy 中使用 属性 名称或 getter 访问值将是完全有效的 - 这通常会为 SomeClass 提供相同的结果:

SomeClass someClass = new SomeClass()
assert someClass.myProperty == 'foo'
assert someClass.getMyProperty() == 'foo'

但是 - 由于 Jenkins Pipeline 实现中的一个缺陷 - 有时(!)你被迫使用 getter - 因为普通的 属性 访问将不起作用(当使用一些 class 层级),参见:JENKINS-47143。糟糕的是,相同的代码可能适用于某些工作,但不适用于其他工作:

SomeClass someClass = new SomeClass()
assert someClass.myProperty == 'foo' // sometimes throws 'property not found' error
assert someClass.getMyProperty() == 'foo'

现在我已经对我们的 Jenkins 共享库进行了几个单元测试 - 但缺少的是一种检测 属性 访问的方法,简而言之:一种禁止 属性 的方法访问所以单元测试会提前抱怨。

以下代码:

class SomeClass { 
  String myProperty = 'foo'
}

SomeClass.metaClass.getProperty = { String name -> 
  throw new RuntimeException("tried to get property ${name}, property access only allowed via getXX() methods")
}

def s = new SomeClass()

println(s.myProperty)       // a
println(s.getMyProperty())  // b

a行会抛出异常,b行不会抛出异常。我怀疑如果 SomeClass 是用 java 编写的,这是不可能的,但假设 groovy class 这可能是实现你想要的东西的一种方式。

运行 以上将导致:

─➤ groovy solution.groovy
Caught: java.lang.RuntimeException: tried to get property myProperty, property access only allowed via getXX() methods
java.lang.RuntimeException: tried to get property myProperty, property access only allowed via getXX() methods
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
...