2011-09-07 5 views
10

Tengo un java jar He descompilado con el permiso del desarrollador original que vamos a utilizar hasta que puedan obtener una copia del código fuente. Me he encontrado con un miembro de una clase que tiene el siguiente aspecto:

Classname.access$002(Param1, Param2); 

Nombre de clase es correcta, pero el acceso $ 002 no se ve a la derecha (hay algunos otros como este, excepto con los nombres de acceso $ 204 y con otros números añadidos al final), y me pregunto si esto significa algo en Java o si es porque la operación de descompilación fue incompleta.

Estoy usando JD-GUI para descompilar las clases.

También vale la pena mencionar que no hay métodos con la misma firma que el método de acceso $ 002, al menos en la clase Classname.

+0

Estos enlaces pueden ser útiles: http://www.retrologic.com/innerclasses.doc7.html y http://stackoverflow.com/questions/6167326/java-class-name-containing-dollar-sign - el primer enlace menciona que pueden ser métodos creados como parte de clases de acceso interno para ayudar a la JVM a comprender la agrupación de clases que pueden acceder a algún miembro. – birryree

+1

El término técnico es accessor sintético. – McDowell

Respuesta

17

Los métodos access$XXX son llamadas desde clases internas no estáticas a miembros de la clase de anidamiento.

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

Es un [método sintético generado] (http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html#isSynthetic()) – Radim

Cuestiones relacionadas