【问题标题】:How to access public class member called 'properties'?如何访问称为“属性”的公共类成员?
【发布时间】:2018-12-04 23:33:43
【问题描述】:

假设我有以下来自 3rd 方库的 Java 类:

public class Itm {
    public final Map<String, String> properties = ['foo': 'bar']
}

使用以下代码println new Itm().properties 我希望得到一个地图:[[foo:bar]]

但结果是:

[class:class Itm]

我意识到,如果我在 Groovy 中创建相同的类,但在没有 public 修饰符的情况下声明 properties 字段,我会得到预期的结果。但是我使用的类有public 访问修饰符。那么在这种情况下,我如何访问名为propertiespublic 字段,而不是默认的Groovy 的getProperties(Object self)

【问题讨论】:

    标签: groovy


    【解决方案1】:

    您可以使用 Groovy 的 direct field access operator obj.@field。此运算符省略了使用 getter 方法并直接访问对象字段。假设我们有以下 Java 类:

    Itm.java

    import java.util.HashMap;
    import java.util.Map;
    
    public class Itm {
        public final Map<String, String> properties = new HashMap<String,String>() {{
            put("foo", "bar");
        }};
    
    
    }
    

    以及以下使用它的 Groovy 脚本:

    println new Itm().@properties
    

    输出是:

    [foo:bar]
    

    【讨论】:

    • 谢谢!你能解释一下为什么省略 public 关键字也有帮助吗?
    • 它在 Groovy 类中没有 public 关键字也能工作,因为 final Map properties 被编译为一个最终私有字段,并重写了 public Map getProperties() 方法。因此,当您调用 new Itm().properties 时,您调用了这个返回属性字段的 getter 方法,而不是默认的 Groovy getProperties 方法。
    猜你喜欢
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2013-03-25
    相关资源
    最近更新 更多