拦截ClassCastException';什么是Groovy?
我有很多代码使用并期望java.util.Date,我想将其迁移到org.joda.time.LocalDate。问题是大部分代码都是动态类型的 因此,我想知道是否有任何groovy方法可以拦截ClassCastException,在运行时进行转换(而不是让异常冒泡)并记录操作(这样我就可以修复代码) 例如:拦截ClassCastException';什么是Groovy?,groovy,Groovy,我有很多代码使用并期望java.util.Date,我想将其迁移到org.joda.time.LocalDate。问题是大部分代码都是动态类型的 因此,我想知道是否有任何groovy方法可以拦截ClassCastException,在运行时进行转换(而不是让异常冒泡)并记录操作(这样我就可以修复代码) 例如: import org.joda.time.LocalDate def someMethod(date) { println date.year() } // this call
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: 您可以从Groovy multimethods中获益:为JodaTime编写一个方法重载,并在java.util.Date方法是动态方法参数时选择它:
def someMethod(date) {
println date.year()
}
我的建议是在这个类中编写一个执行转换的方法重载:
def someMethod(LocalDate date) {
someMethod date.convertToJavaDate()
}
如果您没有访问该代码的权限,可以使用元编程
想法2: 如果你有一个巨大的库,我猜你最好混合JodaTime类。您将从duck打字中获得强大的优势。您需要知道调用java.util.Date中的哪些成员,并将它们重新路由到Joda自己的方法:
class LocalDateMixin {
def year() { this[Calendar.YEAR] }
}
LocalDate.metaClass.mixin LocalDateMixin
您也可以使用。如果2.0使用@Typed来防止这种情况发生,您可以发布一些代码片段吗?想法1可能会奏效。我将不得不编写和使用一百种转换方法,而我不会迁移所有的代码。元编程方法会更好,我想,我会深入研究这个问题。你们有多少类需要这种转换?