2011-09-07 4 views
10

Ho un jar java che ho decompilato con il permesso dello sviluppatore originale che dobbiamo utilizzare fino a quando non ci può ottenere una copia del codice sorgente. Ho incontrato un membro di una classe che è simile al seguente:

Classname.access$002(Param1, Param2); 

Classname è corretto, ma il accesso $ 002 non guarda a destra (ci sono un paio di altri come questo se non con i nomi di accesso $ 204 e con altri numeri aggiunti alla fine), e mi chiedo se questo significhi qualcosa in Java o se è perché l'operazione di decompilazione era incompleta.

Sto usando JD-GUI per decompilare le classi.

Vale anche la pena ricordare che non esistono metodi con la stessa firma dell'accesso $ 002, almeno nella classe Nome classe.

+0

Questi link possono aiutare: http://www.retrologic.com/innerclasses.doc7.html e http://stackoverflow.com/questions/6167326/java-class-name-containing-dollar-sign - il primo link menziona che possono essere metodi creati come parte delle classi di accesso interne per aiutare la JVM a comprendere il raggruppamento di classi che possono accedere ad alcuni membri. – birryree

+1

Il termine tecnico è accessoria sintetica. – McDowell

risposta

17

I metodi access$XXX sono chiamate da classi interne non statiche a membri della classe di nidificazione.

public class DummyDummy { 

private int x = 0; 
private Inner i = new Inner(); 
private int foo(int a, int b) { 
    return a+b+x; 
} 

private class Inner { 
    void doIt() { 
     System.out.println(
     // Here, DummyDummy.access$0(DummyDummy, int, int) is called 
     // which calls DummyDummy.foo(int, int) 
      foo(1,2)    ); 
    } 
} 

public static void main(String[] args) { 
    new DummyDummy().i.doIt(); 
} 

} 
+0

È un metodo [metodo sintetico] generato (http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html#isSynthetic()) – Radim

Problemi correlati