Groovy - 如何替换现有java类的方法

时间:2012-02-09 03:35:41

标签: grails groovy

如何替换现有java类的方法(在我的例子中为GrailsDataBinder)。 我读过java类的方法调用没有通过invokeMethod,因此它不起作用,但我认为会有一些解决方案。

我刚试过这个

GrailsDataBinder.metaClass.static.createBinder = {Object target, String objectName ->   
  throw new RuntimeException() 
} 

这个

GrailsDataBinder.class.metaClass.static.createBinder = {Object target, String 
  objectName -> throw new RuntimeException() 
} 

但是这似乎没有替换该方法,因为我的闭包没有被调用,而是原始方法执行。

更新

我刚刚发现,如果我从测试类本身调用createBinder,正在执行闭包 - 所以它可以工作并且方法被替换

void testDataBinder() {
    GrailsDataBinder.createBinder(null, null)
}

但是当从DataBindingUtils调用它时,它总是执行原始方法(DataBindingUtils也是一个java类)

以下是DataBindingUtils中调用该方法的代码。

binder = GrailsDataBinder.createBinder(object, object.getClass().getName());

注意:之前有一些类似的问题,但没有一个对我有效。

1 个答案:

答案 0 :(得分:1)

一旦你看到Groovy的力量,这是令人失望的。但是,正如您所知,Groovy中提供的许多很酷的元类等功能根本无法在Java类上运行。

如果你试图在Java类上覆盖,存根或模拟内容以进行单元测试等,我建议调查Spock,因为它使用的“魔法”实际上也适用于Java类。

如果由于某些其他原因尝试覆盖方法,则应尝试使用Groovy类扩展Java类或使用Groovy类“包装”Java类以获得外部类调用类时所需的元类功能方法。不幸的是,这仍然不允许您拦截Java类对其自身的调用。