为什么反编译的java程序并不总是直接可编译,哪些部分不是?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么反编译的java程序并不总是直接可编译,哪些部分不是?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1446字,纯文字阅读大概需要3分钟。
内容图文
![为什么反编译的java程序并不总是直接可编译,哪些部分不是?](/upload/InfoBanner/zyjiaocheng/791/67b0f514626044f1bb2570262b59f1ad.jpg)
所以我试图对编译的java程序进行轻微的有效法律更改.我正在使用JD-GUI for Mac反编译它.在大多数情况下,反编译的代码没有错误,但是有一些奇怪的东西,如未声明的变量,多个相同的变量声明以及一些不易编译的奇怪语句.
反编译代码中的一些奇怪的陈述真的令人费解.我特别遇到一个switch语句有问题:
switch ($SWITCH_TABLE$PackageName$ClassName$InnerEnumName()[getPlatform().ordinal()])
其中PackageName.ClassName是此语句所在的类,而InnerEnumName是ClassName中的内部枚举.
另请注意,getPlatform()是ClassName中的一个方法,它返回一个InnerEnumName类型的枚举
奇怪的是,当我刚刚剥离这类有问题的语句,编译它,并将其重新插入程序时,它开始工作但有一些奇怪的错误.
例如,当我将switch语句更改为
switch (getPlatform().ordinal())
当它应该击中案例4时(第四个案例以及第4个案例),它开始触及案例3(第三个案例和第3个案例)
解决方法:
反编译总是不完美的.反编译器必须采用字节码并对原始源进行反向工程,确定循环的位置,循环控制的内容等等.我绝不会期望它对于非平凡的程序是完美无缺的.
在$names的情况下,这些是在“伪造”内部类的过程中内部生成的名称(因为JVM实际上不支持内部类).反编译器显然做了一个不完美的工作,弄清楚内部类是什么,并适当地命名它们和编译器创建的伪造东西的对象.熟悉字节码格式的人可能会很快地解决问题,但是,和其他人一样,这是非常重要的.
(在这种特殊情况下,由于某种原因,编译器似乎创建了一个从内部枚举值到其他一些值的映射表,当你“删除”该语句时,你丢失了该映射.)
[我将补充说,反编译器的一个大问题是javac是一个如此移动的目标.特别是像内部类实现这样的东西正在不断调整,所以一周工作可能会失败,下一个版本的编译器的下一个.001版本.
内容总结
以上是互联网集市为您收集整理的为什么反编译的java程序并不总是直接可编译,哪些部分不是?全部内容,希望文章能够帮你解决为什么反编译的java程序并不总是直接可编译,哪些部分不是?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。