解码Android的反编译源代码

时间:2011-12-17 05:52:08

标签: java android

我正在尝试为我最喜欢的Android应用程序制作一个图标扩展包,而我唯一的来源是一些反编译源。我不确定应该代替“main.1 local1 = new Main.1(this)”

Gallery localGallery1 = (Gallery)findViewById(R.id.icon_gallery);
IconImageAdapter localIconImageAdapter = new IconImageAdapter(this);
localGallery1.setAdapter(localIconImageAdapter);
Main.1 local1 = new Main.1(this);
localGallery1.setOnItemClickListener(local1);

另外,我不太确定Main.access $ 0或$ 0的要求是什么。 Eclipse会在它们上面抛出一个错误。

int i = Main.access$0(this.this$0)[paramInt].intValue();

在我编写自己的代码时,我使用此源作为我的参考点。我只是需要帮助整理垃圾以更好地理解它。我需要知道Main.1 local1 = new Main.1(这个)正在讨论什么。以及Main.access $ 0(this.this $ 0) 因为main.1对Java不正确。

1 个答案:

答案 0 :(得分:2)

这些神秘符号通常对应于匿名内部类。 Java VM不了解它们,只了解顶级类,因此Java编译器提供了几种解决方法来使内部类工作。

据我所知Main.1AdapterView.OnItemClickListener的匿名本地实现:

OnItemClickListener local1 = new OnItemClickListener() {
    // ...
}

本地类隐式引用其封闭类的实例,这就是您看到new Main.1(this)调用的原因。 'this $ 0'对应于反编译代码中的此引用。

JVM阻止类访问其他类的privates方法,因此编译器会生成几个合成的包私有方法,如access$0,以便访问封装实例的私有方法。 "Designing for performance"更详细地解释了这一点,如果您需要从内部类访问它们,建议使用package-private方法。

intValue可能会被明确调用,也可能是自动取消装箱的结果。

Java语言的许多其他功能都是使用泛型和协变返回类型等合成方法实现的。