Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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
将Java代码1.5降级为1.4(额外积分:J2ME、黑莓!!!)_Java_Java Me_Bytecode_Downgrade - Fatal编程技术网

将Java代码1.5降级为1.4(额外积分:J2ME、黑莓!!!)

将Java代码1.5降级为1.4(额外积分:J2ME、黑莓!!!),java,java-me,bytecode,downgrade,Java,Java Me,Bytecode,Downgrade,我想移植一些现有的j2se库(例如Apache压缩库)用于Blackberry开发,但有一个缺点(不仅仅是一个) 首先,大多数java LIB广泛使用j2se集合和数据类型,而j2me平台上通常缺少这些集合和数据类型,但由于Apache Harmony等开源j2se api实现,这在理论上是可以解决的。更大的问题是,Blackberry JDK似乎基于java 1.4,因此任何使用泛型和其他1.5功能(如Enum)的代码都无法在Blackberry上轻松编译 这就提出了一个有趣的问题,即是否有任

我想移植一些现有的j2se库(例如Apache压缩库)用于Blackberry开发,但有一个缺点(不仅仅是一个)

首先,大多数java LIB广泛使用j2se集合和数据类型,而j2me平台上通常缺少这些集合和数据类型,但由于Apache Harmony等开源j2se api实现,这在理论上是可以解决的。更大的问题是,Blackberry JDK似乎基于java 1.4,因此任何使用泛型和其他1.5功能(如Enum)的代码都无法在Blackberry上轻松编译

这就提出了一个有趣的问题,即是否有任何现有的工具或项目可以进行自动1.5->1.4转换,同时支持j2me bastardized字节码:)

我能找到的一个项目是,但我不确定这个项目有多活跃


我确信1.5->1.4自动转换的问题不是唯一的——那么有人有过这种转换的经验吗?

我以前使用过retroweaver(J2SE,而不是J2ME)-它工作得非常好。使用它的成本是额外的几个运行时依赖项

更新2013-01-28:在遇到RetroWeaver问题后,我切换到了。

你试过了吗?我读到它比Retroweaver做得更好

这里是我在堆栈溢出上找到的:

使用常规javac编译并针对较旧的JVM将至少为泛型提供适当的字节码


这绝对是有意义的尝试。

这里是我找到的另外两个工具(链接到Retrotranslator的页面):


到目前为止,我最后做的是:Declawer+一些用于生成枚举类的自定义代码

Declawer的一个不同之处在于,尽管它非常简单,而且坦率地说,有点像黑客(它依赖于JavaC的一个未记录的功能),但与增强或转换的Java字节码相比,它的输出是实际的Java代码。这对于基于java的移动开发来说是非常宝贵的,因为坦率地说,字节码修改/插装根本不像j2se那样为j2me平台开发,而且也不能保证事情会像j2se那样开箱即用,因为很多开发人员已经使用了这些工具

Declawer的功能是有限的(不喜欢1.5枚举或自动装箱),所以我不得不添加一个python脚本,从简单的描述符自动生成功能相当于1.5枚举的类。这一代发生在构建时

到目前为止,这解决了我的顾虑,唯一的例外是为我的应用程序找到一个好的j2me友好的IoC容器(一旦你尝试了这些家伙,很难放弃他们)


但这是一个不同主题的讨论。

太棒了,谢谢!这似乎比retroweaver有更好的文档。我将不得不玩一玩:)我想,我唯一关心的是编译器为j2me平台生成的类文件中的字节码差异如何影响这些工具。因为我不能评论其他人在帖子中的评论(目前还没有50%的声誉),我将在这里发布:-关于使用1.5进行源代码编译和1.4进行目标代码编译,只有在代码中不使用任何1.5功能时,它才会起作用(尽管它对泛型有效,但我很惊讶,但我可以理解为什么因为泛型在运行时“消失”),因此它没有帮助。-关于您发现的其他工具,我确实希望至少有一个工具可以帮助您解决问题的各个方面。我记不清了,但我认为泛型可以,但不支持Enum/new for syntax。它可能在以后的javac中得到了修复,但在我看来,它几乎不可用。这就是我最终使用retroweaver的原因之一。不幸的是,这不起作用。javac不接受比目标版本更高的源代码版本,因此您只能在编译失败和无法在目标平台上运行的结果之间进行选择。Eclipse编译器“ecj”可以。它可以很容易地集成到ant和maven java编译任务中。1.4不会提供java me,因为“所有java me平台目前都限制在JRE 1.3”(例如,java me没有JDK 1.4特定的断言)