2014-03-24 110 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)"]