如何检查Groovy类是否覆盖父方法

时间:2014-03-24 22:45:39

标签: groovy introspection

我有两个Groovy类,Child1Child2,它们派生自一个抽象的父类Parent。父类实现了三种方法,只是它们的参数不同(即它们的方法名称相同)。

现在我有了一个子类的实例。任务是检查该对象的类是否实现(覆盖)一个或多个父方法。

我在子类对象上尝试使用Groovy的Inspector。这给了我所有方法的列表,但我不知道如何读取输出。特别是我不明白我正在寻找的方法是在子类中实现,还是仅在父类中实现。

任何人都可以帮助我,我可能需要另一种内省方法吗?

2 个答案:

答案 0 :(得分:0)

希望这会有所帮助。我仍然觉得有一种更加时髦的方式。尝试使用collectInheritedMethods()查看您是否得到了您想要的内容。我故意想要返回匹配方法的列表而不仅仅是一个标志,因为你也可以看到从超类实现的方法,列表上的Groovy真值(if(collectInheritedMethods(..)))就足以标记了。

abstract class Parent {
    void method1() { println "No Param" }
    void method1( def a ) { println "param: $a" }
    void method1( List a, Map b ) { println "param: $a and $b" }
}

class Child extends Parent {
    void method1() { println "A: no param" }
    void method1( def a ) { println "A: param $a" }
    void method1( def a, def b ) { println "A: param $a and $b" }
}

List collectInheritedMethods( Class parent, Class child ) {
    List inheritedMethods = [] 
    def parentMethods = parent.declaredMethods.findAll { !it.synthetic }
    def childMethods = child.declaredMethods.findAll { !it.synthetic }

    for( chMet in childMethods ) {
        for( paMet in parentMethods ) {
            if( chMet.name == paMet.name && 
                  chMet.parameterTypes == paMet.parameterTypes && 
                     chMet.returnType == paMet.returnType ) {

                inheritedMethods << child.getMethod( chMet.name, 
                                                    chMet.parameterTypes )
                                         .toGenericString()

                //if only a flag is required to check if method implemented
                //flag = true
                //break
            }
        }
    }

    //Groovier way
    /*inheritedMethods = childMethods.findAll { chMet -> 
        parentMethods.findAll { paMet -> 
            chMet.name == paMet.name && 
                chMet.parameterTypes == paMet.parameterTypes && 
                    chMet.returnType == paMet.returnType 
        } 
    }*/

    inheritedMethods
}

assert collectInheritedMethods( Parent, Child ) == 
       ["public void Child.method1()", 
        "public void Child.method1(java.lang.Object)"]

答案 1 :(得分:-2)

所以我最终得到了这个解决方案,它完全符合我的要求:

def pattern = ~/^public void ... $/
for(method in obj.metaClass.methods.findAll { it ==~ pattern })
{
    /* Do some stuff... */
}