如何使用metaClass和invokeMethod实现委托?

时间:2011-05-08 17:34:36

标签: grails groovy

我试图创建一个有点灵活的标记解决方案。我之前曾想过像这样解决它:Polymorphic belongsTo in many to many mapping in grails?。但由于这似乎没有结果,所以我不会朝另一个方向前进。

我现在要做的是检测域类是否有hasMany类的Tag引用。如果是,那么我尝试将方法委派分配给taggableService

以下所有代码都试图找到指定的方法并在当前对象上调用它。但是,如果它找不到它,则尝试在委托对象上调用它。如果全部失败,则抛出MissingMethodException。

for(GrailsClass c in grailsApplication.getDomainClasses()){
    Map hasMany = c.getPropertyValue('hasMany')

    //continue of has a many mapping with Tag class as its endpoint
    if(hasMany && hasMany.containsValue(Tag)){

        //replace invokeMethod with a delegate strategy
        c.clazz.metaClass.invokeMethod = { String name, args ->
            def metaMethod = c.clazz.metaClass.getMetaMethod(name,args)
            if(metaMethod){
                return metaMethod.invoke(delegate,args);
            }

            metaMethod = taggableService.class.metaClass.getMetaMethod(name, args)
            if(metaMethod){
                return metaMethod.invoke(taggableService,args);
            }
            throw new MissingMethodException(name,delegate.class,args)
        }
    }
}
然而,这似乎没有达到预期的效果。我在groovyland有点迷失了,有人能帮助我吗?

1 个答案:

答案 0 :(得分:0)

事实证明,只是测试框架没有正确处理引导程序。如果我在控制器类中测试它。它工作得很好...... :(