首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Java 5/6特性支持到Java1.4?

将Java 5/6特性支持到Java1.4?
EN

Stack Overflow用户
提问于 2009-06-18 09:24:22
回答 5查看 4.3K关注 0票数 8

我们一直使用Java2SE v1.4到2010年底。这真的很恶心,但我们无法控制。我们现在有哪些选择来使用一些新特性呢?我可以想出几种方法

  • 更改字节码,例如使用反向翻译器回纬器
  • 库的后端,例如并发Backport,但这对泛型没有帮助。
  • 模拟Java 5的特性,例如选中集合、使用助手方法的Varargs等。
  • 通过预编译更改源代码,在最终编译之前删除所有1.5的内容,例如使用德劳尔可以做到这一点。

我最感兴趣的是在使用Weblogic和“真正”东西的生产环境中使用它的非常积极的经验。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-07-08 15:44:35

谢谢你的回答。这是所有相关答案的总结和我自己的研究。

更改字节码: Retros

这是由“复古”-tools反向翻译器回纬器JBossRetro完成的。回传翻译似乎是其中最成熟、最活跃的工具。这些工具扫描所有类并更改字节码以删除Java 5和6特性。许多Java5特性都受到支持,有些是通过使用第三方后端库来支持的。这个选项是最流行的,并有一些积极的反馈用户。实验表明,它是正常工作的。请参阅关于developerworks的简要概述。

支持:您可以完全使用Java 5进行开发,构建模块和各种JAR。最后,您只需将所有类转换为Java1.4并打包您的EAR。这很容易用Retrotranslator的Maven集成(org.codehaus.mojo:retrotranslator-maven-plugin)来完成。

Con:保守的环境不允许部署更改的字节码。追溯步骤的结果对任何编码器都是不可见的,不能被批准。第二个问题是恐惧:可能会有一些神秘的生产问题,而复古代码是另一个可能被指责的步骤。应用服务器供应商可能会因为字节码的改变而拒绝帮助。所以没有人愿意承担在生产中使用它的责任。这与其说是技术问题,不如说是警察问题,所以我看不出有什么解决办法。这件事发生在我们身上,所以我正在寻找更多的选择:

将Java5编译为Java1.4: jsr14

有一个不受支持的选项javac -source 1.5 and -target jsr14,它将Java5源代码编译为有效的Java1.4字节码。大多数特性,如varargs或extended循环,反正都是由编译器翻译的。泛型和注释被剥离。Enum不受支持,我也不知道自动装箱,因为valueOf方法大多是在Java5中引入的。

Con:只有字节码被翻译,库的使用没有改变。因此,您必须小心不要使用特定于Java5的API(但可以使用Backport)。此外,您还必须同时构建所有模块,因为在开发过程中,您可能希望Java5代码具有通用和注释信息。因此,为了Java1.4的生产,您必须从头开始构建整个项目。

将源代码更改为Java1.4: Declawer

正如在相关问题中回答的那样,有一个编译器扩展德劳尔,它适用于泛型和varargs,但不适用于增强的循环或自动装箱。生成的源“有点古怪,但不算太糟”。

Pro:生成的源是可用的,可以进行审查。在最坏的情况下,可以在这个源中进行修复。没有“魔力”,因为源代码是有效的Java。有些人甚至使用JAD (Java反编译器)再次获得Java1.4源代码。如果使用调试信息编译且不使用内部类,则Jad可读输出是可读的。

Con:与-target jsr14类似,您需要在部署中增加一个步骤。图书馆也有同样的问题。

将源代码更改为Java1.4:手动

有几个答案建议用手做。对于一个自动的、重复的构建过程来说,这当然不是有用的,但是对于一次性的更改来说,这是合理的。只需自动完成可能的事情。也许可以看看Antlr来创建一个本土的转换工具。

支持的图书馆:

问题是,Java5还提供了新的库,这些库在旧的JRE中是不可用的,请参阅相关问题。幸运的是,有几个支持移植的库为您提供了Java5的一些功能,但不能模拟语言特性,比如泛型。

  • 注解,在TSS上讨论
  • 并发性
  • com.sun.net.httpserver (Java6至5)
  • Gif写作 (Java6至5)
  • 启动您自己的后台项目;-)
  • 您可能会从JDK或其他库中复制所需的类,但它们很可能与其他类相关。

在Java1.4代码中模拟Java5特性:

我在想一些事情,您可能会做一些事情,使您的生活更轻松,并且仍然停留在Java1.4中。最重要的特性是类型化收藏,以下是一些想法:

  • 与使用泛型不同,您可以使用一些模板创建自己的类型存储容器。
  • 添加一个(不再是Iterator )。
  • 添加允许asList参数和数组的1,2,...,n方法(以模拟varargs)。
  • varargs (将1,...,n参数转换为数组)和valueOf的方法可以放在某些助手类中。
票数 11
EN

Stack Overflow用户

发布于 2009-06-18 09:28:15

源代码预编译,在最终编译和部署之前,删除所有1.5的内容。有什么工具可以做到这一点吗?

是。他们叫回音翻译或Retroweaver。除了泛型(它只是为了编译器而存在)之外,您不能简单地“剥离1.5东西”。Enum(可能还有其他一些特性)必须用功能等效的代码来替换。这些工具就是这么做的。

票数 2
EN

Stack Overflow用户

发布于 2009-06-18 14:05:29

--您可以在编译时使用JDK1.5特性、和目标JDK1.4进行编码。请参阅可用的Javac选项。但是,大多数库现在都在使用JDK1.5代码,因此您将不得不使用旧的库。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1011706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档