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

时间:2014-06-05 23:08:35

标签: inheritance groovy 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)
        }
    }
}

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

groovy.lang.MissingPropertyException: No such property: jSessionIdCookie for class: ResellerWebUiRestRequestSender

为什么?为什么超类方法无法在Groovy中看到超类中定义的属性?

1 个答案:

答案 0 :(得分:1)

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

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

getJSessionIdCookie() { jSessionIdCookie }

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