我有两个Groovy类,Child1
和Child2
,它们派生自一个抽象的父类Parent
。父类实现了三种方法,只是它们的参数不同(即它们的方法名称相同)。
现在我有了一个子类的实例。任务是检查该对象的类是否实现(覆盖)一个或多个父方法。
我在子类对象上尝试使用Groovy的Inspector
。这给了我所有方法的列表,但我不知道如何读取输出。特别是我不明白我正在寻找的方法是在子类中实现,还是仅在父类中实现。
任何人都可以帮助我,我可能需要另一种内省方法吗?
答案 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... */
}