2012-02-21 19 views
6

Al descompilar un jar específico usando el descompilador java (http://java.decompiler.free.fr/) Obtuve un código extraño que no puedo identificar. ¿alguien me puede ayudar? el código es algo como:descompilación java

Foo.access$004(Foo.this); 

o esta

Bar.access$006(Bar.this); 

o de lo contrario

Baz.access$102(Baz.this, true) 

¿Cuáles son estos métodos access$004, access$006 y access$102?

+3

Se hizo una pregunta similar y obtuve algunas buenas respuestas [aquí] (http://stackoverflow.com/questions/5524358/what-is-this-referencing). – cutchin

+1

¿Desea utilizar este decompilador o, en su lugar, puede utilizar JAD? http://www.varaneckas.com/jad –

+0

¿No sabes por qué, Gergely? :) Jörn tiene razón. JD no reconoce todos los patrones de código para métodos sintéticos. –

Respuesta

13

Se crean métodos sintéticos como este para admitir métodos privados privados de clases internas. Como las clases internas no formaban parte de la versión inicial de jvm, los modificadores de acceso no podían manejar este caso. La solución fue crear métodos adicionales visibles para el paquete que delegan a la implementación privada.

public class Example { 
    private static class Inner { 
     private void innerMethod() { ... } 
    } 

    public void test() { 
     Inner inner = ... 
     inner.innerMethod(): 
    } 
} 

La compilación crearía un nuevo método de la clase Inner así:

static void access$000(Inner inner) { 
    inner.innerMethod(); 
} 

y vuelva a colocar la llamada en el método test así:

Inner.access$000(inner); 

El estática access$000 es paquete visible y tan accesible desde la clase externa, y estando dentro de la misma clase Inner que puede delegar a la clase privada innerMethod.

0

Si se obtiene el archivo .class correspondiente (pista frasco a través de descompresión), y ejecute el archivo .class a través JAD

JAD MyClass.class 

entonces es posible que el archivo de salida JAD ha descompilada esa línea particular en una manera más significativa, por ejemplo

Baz.access$102(Baz.this, true) 

aparece en la salida JAD como simplemente

myMemberVaiable = true 

donde myMemberVaiable es un miembro de la clase de Baz que va a reconocer.

Cuestiones relacionadas