我需要编写代码来处理日期。我们正在慢慢地从Java 7过渡到Java 8,所以我的库代码必须同时使用。出于这个原因,它必须编译Java 7中在Java 7中编译使用Java 8类型的方法
然而,已经迁移到Java 8项目中使用JSR-310型开始。
if (obj instanceof Date){
//Serialize using SimpleDateFormat
} else if (obj instanceof org.joda.time.LocalDateTime){
//Serialize using Joda
} else if (obj instanceof java.time.LocalDateTime){
//Serialize using JSR 310
}
我不是用在Java 8中引入lambda表达式或其他语言的东西我使用Java编译器8无论如何请看下面的语句。我想要的是创建Java 7兼容代码(因此没有UnsupportedClassVersionError
),当Java 7中第三个if分支命中时(NoClassDefFoundError
),该代码会中断。
目前上面的代码根本不编译,如果我使用Java 8 javac编译器设置为Java 7目标。
我在一个Java 8环境
<javac includeantruntime="false" srcdir="src" destdir="build/compiled" target="1.7" source="1.7"
运行Ant但是,如果使用import java.time.LocalDateTime
作为招它不会编译。 我想到的是一个Java编译器8靶向Java 7的就没有那么聪明,看到虽然LocalDateTime
类是Java 8类路径,它不是在Java 7中
我不希望是什么使用反射(if (obj.getClass().getCanonicalName().equals("java.time.LocalDateTime")
和其他基于反射的东西)和我宁愿不依赖性增加ThreeTen-Backport如JSR-310类型不在Java中正在使用的7个项目,我更喜欢从Java排除threeten 8个项目而不弄乱常春藤依赖关系文件。
任何聪明的想法?我已经有一个解决方案(服务提供商界面与单独的罐子),但我想保持它作为最后的手段。
检查旧软件(很容易)是否在java 8下运行,并首先执行运行时转换。其他任何东西都是混乱的。然后,您可以在闲暇之余迁移,并提供正确的反馈。 –
有些客户直到2025年才会迁移到Java 8.这是我的约束条件 –
鉴于编译器将始终包含对java.time的引用,因此尝试编写J7和J8兼容解决方案将不起作用。如果你现在不能迁移到J8,那么坚持jodatime(虽然J7从'11,J8从'14)。 –