4

我有一个带有.getProperties()方法的 Java 类,但是在 Groovy 中调用该方法时,它会从Groovy Beans 魔术LinkedHashMap返回一个属性,而不是我的 Java 类定义的 getProperties 方法。

如何调用我的getProperties()方法而不是 Groovy 方法?

我的 Java 代码(简化):

import java.util.*;

public class MyObject {
    private Collection<Property> properties;

    private static class Property {
        public String value;

        public Property(String value) {
            this.value = value;
        }

        public String toString() {
            return String.format("Property: %s", this.value);
        }
    }

    private static interface PropertyFilter {
        boolean passes(String value);
    }

    public static class StartsWithPropertyFilter implements PropertyFilter {
        public String prefix;

        public StartsWithPropertyFilter(String prefix) {
            this.prefix = prefix;
        }

        public boolean passes(String value) {
            if(value == null)
                return false;
            return value.startsWith(prefix);
        }
    }

    public MyObject() {
        this(new ArrayList<Property>());
    }

    public MyObject(Collection<Property> myProperties) {
        this.properties = myProperties;
    }

    public void addProperty(String value) {
        this.properties.add(new Property(value));
    }

    public Collection<Property> getProperties(PropertyFilter... filters) {
        Collection<Property> ret = new ArrayList<Property>();
        for(Property prop : properties) {
            boolean passes = true;
            for(PropertyFilter filter : filters) {
                if(!filter.passes(prop.value)) {
                    passes = false;
                    break;
                }
            }
            if(passes) {
                ret.add(prop);
            }
        }
        System.out.println("Java getProperties()");
        return ret;
    }

    public static void main(String[] args) {
        MyObject obj = new MyObject();
        obj.addProperty("Fast");
        obj.addProperty("Strong");
        obj.addProperty("Furious");
        System.out.println(obj.getProperties());
        System.out.println(obj.getProperties(new MyObject.StartsWithPropertyFilter("F")));
    }
}

我的 Groovy 代码:

MyObject obj = new MyObject()
obj.addProperty("Fast")
obj.addProperty("Strong")
obj.addProperty("Furious")
println obj.getProperties()
println obj.getProperties(new MyObject.StartsWithPropertyFilter("F"))

运行这个:

javac MyObject.java && groovy Run.groovy && echo && java MyObject

我得到这个输出:

[class:class MyObject]
Java getProperties()
[Property: Fast, Property: Furious]

Java getProperties()
[Property: Fast, Property: Strong, Property: Furious]
Java getProperties()
[Property: Fast, Property: Furious]

我的 Groovy 版本是最近的版本(2.0.1):

$ groovy -version
Groovy Version: 2.0.1 JVM: 1.6.0_27 Vendor: Sun Microsystems Inc. OS: Linux

但我最初在 1.8.5 上看到了这个问题,我相信是的。

4

2 回答 2

1

我没有看到相同的行为。使用 Groovy 1.8.5,如果我将其编译为 Java:

import java.util.*; 

public class MyClass {
    private Collection<String> myProperties;

    public MyClass() {
         this.myProperties = new ArrayList<String>();
    }

    public MyClass(Collection<String> myProperties) {
         this.myProperties = myProperties;
    }

    public Collection<String> getProperties() {
         System.err.println("java getProperties");
         return this.myProperties;
    }
}

并运行这个 Groovy 脚本:

MyClass myClass = new MyClass() println myClass.getProperties()

输出是:

bash-3.2$ javac MyClass.java 
bash-3.2$ groovy Test.groovy 
java getProperties
[]
bash-3.2$ 
于 2012-09-14T21:14:30.900 回答
1

这可能不再相关,但只需稍作改动,您就可以做到这一点:

obj.getProperties([] as MyObject.PropertyFilter[])

变化是 PropertyFilter 接口不能是私有的。

于 2014-07-16T13:56:47.883 回答