2014-03-24 80 views
-1

我有两个Groovy类,Child1Child2,从Parent一个抽象父类派生。父类实现三种方法,只有它们的参数不同(即它们的方法名称相同)。如何检查Groovy类是否覆盖父母的方法

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

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

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

回答

-2

所以我结束了这个解决方案,这不正是我想要的东西:

def pattern = ~/^public void ... $/ 
for(method in obj.metaClass.methods.findAll { it ==~ pattern }) 
{ 
    /* Do some stuff... */ 
} 
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)"]