从扩展类调用时,groovy 中的闭包不能使用私有字段

amo*_*fis 5 groovy inheritance closures

我有一个 groovy 课程,其中有一个私有字段和一个方法。在该方法中,我调用 http 服务,并在其中传递一个闭包来处理响应。像这样的东西:

class WebUiRestRequestSender {

    private String jSessionIdCookie

    def login(String username, String password) {
        //...
        httpClient.post(
            path: login,
            body: parameters,
            requestContentType : URLENC
        )  { resp, reader ->
            jSessionIdCookie = getSessionCookie(resp)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我创建此类的对象并调用此方法时,一切正常。但是,当我从此类继承并尝试从继承类调用该方法时,出现错误:

groovy.lang.MissingPropertyException: No such property: jSessionIdCookie for class: ResellerWebUiRestRequestSender
Run Code Online (Sandbox Code Playgroud)

这是为什么?为什么超类方法看不到 Groovy 中超类中定义的属性?

dma*_*tro 1

Groovy 中的默认访问修饰符是public,这有助于无缝创建 POGO,因为 Groovy 在类生成时自动添加访问器方法。

当访问修饰符更改为 时private,groovy 不会为该属性创建任何访问器方法。为了以只读属性的 getJSessionIdCookie()方式访问该私有属性,必须将方法添加到基类中。

getJSessionIdCookie() { jSessionIdCookie }
Run Code Online (Sandbox Code Playgroud)

现在,当您jSessionIdCookie在子类中访问时,getProperty元类实现将调用上面的 getter 方法。

  • 但我不从子类访问 jSessionIdCookie ?我调用的方法、字段和闭包位于超类中。 (4认同)