我有一个名为 StaticInitializer.class
的类文件,该文件已成功混淆。
当我反编译它时,我得到以下结果,其中 IDE 给出编译器错误“无法从初始化程序中返回
”。删除“return
”语句可以解决该问题。
但实际上我想知道的是,如果混淆的类文件在静态初始化程序中有一个 return
语句,它如何正常工作。
Java 文件的编译阶段和运行阶段之间是否存在不匹配,混淆会检测到并使用它们作为混淆的一种方式?
反编译代码
public class StaticInitializer {
static {
int a=12;
int b=34;
return ;
}
}
编辑: 以下操作显示混淆后的class文件是用jdk 1.5编译的
javap -c StaticInitializer.class
major version: 49
J2SE 8 = 52, J2SE 7 = 51, J2SE 6.0 = 50,
J2SE 5.0 = 49,
JDK 1.4 = 48, JDK 1.3 = 47, JDK 1.2 = 46, JDK 1.1 = 45
最佳答案
反编译器永远不会 100% 准确,因为对任何代码行进行编程都有多种方法。 ALso JAD(当我们说 Java 反编译器时,它几乎是 JAD 的同义词)不支持 JDK 1.5 及更高版本。它不再被开发或维护。
另外查看反编译代码,它会给出错误,因为从 Java 7 开始,它会在加载类之前查找 main 方法。这是对以前的 java 版本的更改,因此您的静态 block 没有执行。在以前的版本中,JRE 的行为是在加载类后和执行静态 block 后查找 main 方法。所以它可以在以前的版本中工作,但不能在新版本的java中工作。但由于 JAD 不再维护,它可能会向您显示曾经有效的过时代码。
关于java - 反编译混淆代码 "Cannot return from within an initializer",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24321724/