Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
拦截ClassCastException';什么是Groovy?_Groovy - Fatal编程技术网

拦截ClassCastException';什么是Groovy?

拦截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

我有很多代码使用并期望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:

您可以从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可能会奏效。我将不得不编写和使用一百种转换方法,而我不会迁移所有的代码。元编程方法会更好,我想,我会深入研究这个问题。你们有多少类需要这种转换?