可以禁用用于访问Groovy中的getter的属性语法吗?

问题描述

我有一个类似groovy的类:

class SomeClass {
    String myProperty = 'foo'
}

通常,使用属性名称或getter访问值通常是完全有效的-通常对SomeClass给出相同的结果:

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

但是-由于Jenkins Pipeline实现中的缺陷-有时(!),您不得不使用getter-因为普通的属性访问将不起作用(使用某些类层次结构时),请参见: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 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)
...

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...