当前位置: 首页 > 面试题库 >

是否将Java 5/6功能反向移植到Java 1.4?

公羊晟
2023-03-14
问题内容

Java 2SE v1.4一直持续到2010年底。这确实很讨厌,但我们无能为力。我们现在必须使用哪些选项才能使用某些新功能?我可以想到几种方式

  • 更改字节码,例如使用Retrotranslator或Retroweaver。

  • 库的反向移植,例如Concurrent Backport,但这对泛型没有帮助。

  • Java 5功能的仿真,例如选中的Collections,带有辅助方法的Varargs等。

  • 通过预编译来更改源代码,在最终编译之前剥离所有1.5的内容,例如使用Declawer可以做到这一点。

我对在使用Weblogic和“真实”东西的生产环境中获得非常积极的体验最感兴趣。


问题答案:

感谢您的回答。这是所有相关答案和我自己的研究的摘要。

更改字节码:Retros
这是通过“复古”工具完成的:Retrotranslator,Retroweaver和JBossRetro。Retrotranslator似乎是其中最成熟,最活跃的工具。这些工具扫描所有类并更改字节码以删除Java
5和6功能。支持许多Java5功能,其中一些功能是通过使用第三方反向端口库实现的。此选项最受欢迎,并且得到了用户的积极反馈。实验表明它可以按预期工作。请参阅有关developerWorks的简短概述。

专业人士:您可以完全使用Java 5开发,构建模块和各种JAR。最后,您只需将所有类转换为Java
1.4并打包EAR。使用Retrotranslator的Maven集成(org.codehaus.mojo:retrotranslator-maven- plugin)可以轻松完成此操作。

缺点:保守的环境不允许部署更改的字节码。追溯结果对任何编码人员都不可见,因此无法通过。第二个问题是恐惧:可能存在一些隐秘的生产问题,而追溯代码可能是对此负有责任的另一步骤。应用服务器供应商可能会由于字节码更改而拒绝帮助。因此,没有人愿意承担将其用于生产的责任。因为这是一个政策问题,而不是技术问题,所以我认为没有解决方案。它发生在我们身上,所以我正在寻找其他选择:-(

将Java5编译为Java 1.4:jsr14
有一个不受支持的选项,javac -source 1.5 and -target jsr14它将Java5源代码编译为有效的Java
1.4字节码。无论如何,大多数功能(如varargs或Extended
for循环)都由编译器翻译。泛型和注释被剥离。不支持枚举,我也不了解自动装箱,因为这些valueOf方法大多数是在Java5中引入的。

缺点:仅翻译字节码,不改变库用法。因此,您必须注意不要使用Java5特定的API(但可以使用Backports)。此外,您还必须同时构建所有模块,因为在开发时,您可能希望Java5代码具有泛型和注释信息。因此,您必须从头开始为Java
1.4生产构建整个项目。

将源代码更改回Java 1.4:Declawer

优点:生成的源可用并且可以查看。在最坏的情况下,可以在此源中进行修复。没有“魔术”,因为源是有效的Java。有些人甚至使用JAD(Java反编译器)再次获得Java
1.4源。如果使用调试信息进行编译并且不使用内部类,则Jad可读的输出是可读的。

缺点:与相似-target jsr14,您需要在部署中执行额外的步骤。库也有同样的问题。

将Source更改回Java 1.4:手工完成
一些答案建议手工完成。对于自动的重复构建过程,这当然没有用,但是对于一次性更改,这是合理的。只是自动化一切。也许看一下Antlr来创建一个本地转换工具。

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

  • 注释,在TSS上讨论
  • 同时
  • com.sun.net.httpserver(Java 6至5)
  • Gif编写(Java 6至5)
  • 开始您自己的backport项目;-)
  • 您可以从JDK或其他库中复制所需的类,但是很可能它们与其他类相关。

在Java 1.4代码中模拟Java5功能:
我在考虑可能要做的一些事情,以使您的生活更轻松并仍然使用Java 1.4。最重要的功能是类型安全集合,以下是一些建议:

  • 可以使用某些模板来创建自己的类型安全容器,而不是使用泛型。
  • 添加一个类型安全的迭代器(不再是迭代器)。
  • 添加asList允许1,2,...,n参数和参数数组的方法(以模拟varargs)。
  • 用于varargs的方法(将1,...,n参数转换为数组),valueOf可以放在一些帮助器类中。


 类似资料:
  • 问题内容: 我有一个为Python 3构建的Python代码库,它使用带有编码参数的Python 3样式的open(): https://github.com/miohtama/vvv/blob/master/vvv/textlineplugin.py#L47 现在,我想将此代码反向移植到Python 2.x,这样我将拥有一个可用于Python 2和Python 3的代码库。 建议的解决差异和缺乏

  • 问题内容: 阅读有关Java 8从lambdas产生什么样的字节码的信息,我想到了Java 5发布的时间。那时有Retroweaver和其他工具,可将用JDK 5编译的字节码转换为可在JRE 1.4上运行。 是否有人为Java 8 lambda创建了这种反向移植工具? 这将使Java开发人员从今天开始已经在生产质量的Java 7 JRE上使用lambda,而不必等待6-12个月的Java 8 GA

  • 问题内容: 我已经尝试将invRegex.py移植到node.js实现了一段时间,但是我仍然在努力。多亏了ret.js标记生成器,我已经有了正则表达式分析树,并且运行良好,但是以内存高效的方式实际生成和连接所有不同元素对我来说是非常具有挑战性的。为简单起见,可以说我有以下正则表达式: 喂养到产生下列输出( tabbified 取更小的空间): 考虑到我能够获取每个单独的令牌并产生所有有效的单独输出

  • 问题内容: 如何反转a的结果?也就是说,在给定我希望引用的字符串的情况下,如何获得一个“类似于Unix shell的” 引用字符串? 更新0 我找到了一个Python错误,并在此处提出了相应的功能请求。 问题答案: 我们现在(3.3)有一个shlex.quote函数。只是移动和记录了文档(使用代码仍然可以使用)。有关整个讨论,请参见http://bugs.python.org/issue9723。

  • 我开始转换所有64位,并注意Mac汇编语法。 我有东西要组装,但我立即遇到了一个奇怪的分段错误: QUIT通过宏defword定义如下: null 附注:是的,我可以让琼斯在Docker图像中完美地工作,但这是重点之外的。我真的希望它在卡特琳娜64位工作,开箱即用。

  • 问题内容: SqlCommand.ExecuteScalar方法 执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略。 我猜这将涉及大量使用泛型。 假设我有一个SQLiteDatabase / Cursor对象。 问题答案: 这种逻辑对我有用: