Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿cuál es el significado de "this.this $ 0"?

¿Cuál es el significado de "this.this $ 0" en este código? ¿qué significa? Sé por qué utilizamos "esto", pero no tengo ni idea de "this.this $ 0"

class MainActivity$1 implements TextWatcher { public void afterTextChanged(Editable paramEditable) { } public void beforeTextChanged(CharSequence paramCharSequence, int paramInt1, int paramInt2, int paramInt3) { } public void onTextChanged(CharSequence paramCharSequence, int paramInt1, int paramInt2, int paramInt3) { this.this$0.ChangeToNumber(paramCharSequence.toString()); } } -----------------------or ---------------------- class MainActivity$2 implements View.OnClickListener { public void onClick(View paramView) { this.this$0.startActivity(new Intent(this.this$0, about.class)); } } 

  • Proguard dice que el archivo jar de entrada se especifica dos veces
  • Escribir aplicaciones en C o C ++ para Android?
  • Cómo obtener el número de correos no leídos de Gmail (en android)
  • La actividad no se reproducirá al azar, muestra sólo la pantalla en blanco en Samsung
  • Tejido para AndroidStudio / Eclipse - No se puede iniciar sesión con otro usuario
  • Desbloquear el dispositivo Android
  • Cómo implementar y usar google cloud sql en mi aplicación android (eclipse)
  • Android error de señal fatal 11 SIGSEGV en diferentes versiones de JellyBean
  • ¿Qué representan los colores de los elementos del árbol de referencia HPROF de Android Studio?
  • ToneGenerator ralentiza la aplicación muy fuertemente
  • ¿Cómo no puedo mostrar la pantalla del teléfono todo el tiempo cuando hago una llamada?
  • Impresión NFC desde la aplicación para Android
  • 3 Solutions collect form web for “¿cuál es el significado de "this.this $ 0"?”

    this.this $ 0 es igual a Main.access $ 0 Estos símbolos misteriosos por lo general corresponden a las clases internas anónimas. La máquina virtual de Java no sabe sobre ellos, sólo sobre las clases de nivel superior, por lo que el compilador de Java proporciona varias soluciones para que las clases internas funcionen.

    La clase local tiene una referencia implícita a la instancia de su clase inclusiva, 'this $ 0' corresponde a esta referencia en el código descompilado. JVM impide que las clases accedan a métodos privados de otras clases, de modo que el compilador genera varios métodos privados de paquete sintético como el acceso $ 0 para acceder a métodos privados de inclusión de instancia.

    Hay muchas otras características del lenguaje Java que se implementan con métodos sintéticos como genéricos y tipos de retorno covariante.

    Te sugiero que revises los enlaces: Decodificación Decompiled código fuente para Android

    y: Consejos de rendimiento

    No hay nada que lo impida (al lado de convenciones de nomenclatura decentes) de tener un miembro de instancia llamado this$0 y luego hacer referencia a él con la palabra clave this .

    Por ejemplo :

     public class SomeClass { int this$0; public SomeClass (int val) { this.this$0 = val; } } 

    La especificación de lenguaje Java 1.1 especifica que el nombre de un tipo que es un miembro de clase, cuando se transforma en código Java 1.0 con el propósito de generar bytecodes de máquina virtual Java, consiste en el nombre completo de la clase interna, excepto que cada uno .' character following a class name is replaced by a .' character following a class name is replaced by a $ '. Además, cada constructor de clase interna recibe la instancia de inclusión en un argumento prependido. Así es como podría verse el código fuente transformado del ejemplo FixedStack:

     public class FixedStack { ... (the methods omitted here are unchanged) public java.util.Enumeration elements() { return new FixedStack$Enumerator(this); } } class FixedStack$Enumerator implements java.util.Enumeration { private FixedStack this$0; // saved copy of FixedStack.this FixedStack$Enumerator(FixedStack this$0) { this.this$0 = this$0; this.count = this$0.top; } int count; public boolean hasMoreElements() { return count > 0; } public Object nextElement() { if (count == 0) throw new NoSuchElementException("FixedStack"); return this$0.array[--count]; } } 

    Cualquier persona que ya ha programado con clases de adaptador Java o C ++ ha escrito código similar a este, excepto que las variables de enlace deben definirse manualmente y explícitamente inicializadas en clases de adaptador de nivel superior, mientras que el compilador de Java 1.1 las crea automáticamente para clases internas.

    Cuando el Enumerador necesita referirse a los campos de la parte superior o de la matriz de la instancia de inclusión, indirectamente a través de un enlace privado denominado $ 0. La ortografía de este nombre es una parte obligatoria de la transformación de las clases internas en el lenguaje Java 1.0, por lo que los depuradores y herramientas similares pueden reconocer tales enlaces fácilmente. (La mayoría de los programadores son felizmente inconscientes de tales nombres.)

    (Nota: Hay algunas limitaciones en algunas implementaciones de Java 1.1, en las que la inicialización de este $ 0 se retrasa hasta que se ejecuta cualquier constructor de superclase. Esto significa que las referencias de nivel superior hechas por un método de subclase pueden fallar si el método pasa a ser ejecutado por el constructor de la superclase.)

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.