当我反编译我的.apk时,我看到了一些额外的文件,例如MainActivity $ 1.java,MainActivity $ 1 $ 1.java等 . 实际上有些文件是空的 . 除此之外,还有一些代码片段,例如
this$0 = MainActivity.this; super();
要么
this$1 = _cls1.this; super();
我在哪里可以阅读更多相关信息?有没有办法恢复我原来的源代码?
此代码来自内部类用Java编译的方式 .
在字节码级别没有直接支持内部类 . 相反,您创建的每个内部类都被编译为单独的类文件,编译器生成桥接代码以允许适当的访问 .
MainActivity $ 1只是MainActivity中定义的匿名类 . MainActivity $ 1 $ 1将是在该内部类中定义的匿名内部类 .
第二部分是内部类的另一个实现细节 . 内部类的实例需要对封闭实例的引用才能访问它(因为它们只是字节码级别的普通类) . 为此,编译器在内部类中生成一个隐藏字段,并在调用超类构造函数之前插入代码以初始化它(在字节码中允许但在Java中不允许) .
显然,您的反编译器试图反编译这些部分,但无法将它们神奇地转换回Java风格的内部类 .
你试过Procyon吗?我不太熟悉它的确切功能,但我敢打赌它可以重建内部类 .
1 回答
此代码来自内部类用Java编译的方式 .
在字节码级别没有直接支持内部类 . 相反,您创建的每个内部类都被编译为单独的类文件,编译器生成桥接代码以允许适当的访问 .
MainActivity $ 1只是MainActivity中定义的匿名类 . MainActivity $ 1 $ 1将是在该内部类中定义的匿名内部类 .
第二部分是内部类的另一个实现细节 . 内部类的实例需要对封闭实例的引用才能访问它(因为它们只是字节码级别的普通类) . 为此,编译器在内部类中生成一个隐藏字段,并在调用超类构造函数之前插入代码以初始化它(在字节码中允许但在Java中不允许) .
显然,您的反编译器试图反编译这些部分,但无法将它们神奇地转换回Java风格的内部类 .
你试过Procyon吗?我不太熟悉它的确切功能,但我敢打赌它可以重建内部类 .