拦截Groovy中的ClassCastException?

时间:2013-01-15 00:21:42

标签: groovy

我有很多代码使用并期待java.util.Date,我想迁移到org.joda.time.LocalDate。问题是大多数代码都是动态输入的。

所以我想知道是否有任何groovy方法来拦截ClassCastException,在运行时进行转换(而不是让异常冒泡)并记录操作(所以我可以修复代码)。

示例:

import org.joda.time.LocalDate

def someMethod(date) {
    println date.year()
}

// this call is ok
someMethod(new LocalDate())

// this call raises an exception
someMethod(new Date())

我不想修改上面的代码,例如使用try-catch包围第二个调用并使用正确的类型调用。我想要一种全球范围内的方法。

1 个答案:

答案 0 :(得分:0)

创意1:

您可以从Groovy多方法中受益:您为JodaTime编写方法重载,并在它是动态方法参数时选择java.util.Date方法:

def someMethod(date) {
    println date.year()
}

我的建议是在这个类中写入执行转换的这些方法的重载:

def someMethod(LocalDate date) {
    someMethod date.convertToJavaDate()
}

如果您无权访问该代码,则可以使用元编程。


创意2:

如果你有一个庞大的图书馆,我的猜测是你最好混合JodaTime课程。鸭子打字你将获得力量优势。您将需要知道调用java.util.Date中的哪些成员并将它们重新路由到Joda自己的方法:

class LocalDateMixin {
  def year() { this[Calendar.YEAR] }
}

LocalDate.metaClass.mixin LocalDateMixin

您还可以使用extension methods来应用元编程。