2011-12-17 3 views
1

J'essaie de faire un pack d'extension d'icône pour l'une de mes applications Android préférées et la seule source que j'ai est une source décompilée. Je ne sais pas ce qui devrait être à la place de "MAIN.1 LOCAL1 = new MAIN.1 (this)"Décodage code source décompilé pour Android

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); 

Aussi, je ne suis pas tout à fait sûr de ce que l'Main.access 0 $ ou 0 $ ce appellent à . Eclipse génère une erreur sur eux.

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

Et pendant que j'écris mon propre code, j'utilise cette source comme point de référence pour le mien. J'ai juste besoin d'aide pour trier les ordures pour le comprendre un peu mieux. J'ai besoin de savoir ce que Main.1 local1 = new Main.1 (ceci) parle. Ainsi que Main.access $ 0 (this.this $ 0) Parce que main.1 n'est pas correct pour Java.

+0

Quelle est votre question? – abcde123483

+0

Désolé. J'ai besoin de savoir ce que Main.1 local1 = new Main.1 (ceci) parle. Ainsi que Main.access $ 0 (this.this $ 0). Je lis ici que des trucs comme ça n'apparaissent que dans une source décompilée. – AndroidKen

+0

Voici une question comme la mienne sur une source décompilée. http://stackoverflow.com/q/5036729 – AndroidKen

Répondre

2

Ces symboles mystérieux correspondent généralement aux classes internes anonymes. La machine virtuelle Java ne les connaît pas, uniquement sur les classes de niveau supérieur, de sorte que le compilateur Java fournit plusieurs solutions de contournement pour que les classes internes fonctionnent.

Pour autant que je peux voir Main.1 est une implémentation locale anonyme de AdapterView.OnItemClickListener:

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

classe locale a implicitement référence à l'instance de sa classe englobante, c'est la raison pour laquelle vous voyez appel à new Main.1(this). 'this $ 0' correspond à cette référence dans le code décompilé. JVM empêche les classes d'accéder aux méthodes privées d'autres classes, de sorte que le compilateur génère plusieurs méthodes synthétiques private-package telles que access$0 afin d'accéder à des méthodes privées d'instance englobante. "Designing for performance" explique cela plus en détail et recommande d'utiliser des méthodes paquet-privées si vous avez besoin d'y accéder depuis une classe interne.

intValue peut être appelée explicitement ou être le résultat d'un auto-déballage.

De nombreuses autres fonctionnalités du langage Java sont implémentées avec des méthodes de synthèse telles que les génériques et les types de retour covariant.

+0

Darth Beleg, merci. Cela a plus de sens. – AndroidKen