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

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

  • Digest autenticación en Android mediante HttpURLConnection
  • NotificationListenerService: NullPointerException en getActiveNotifications
  • Gestión de texto en aplicaciones Android como en un libro electrónico
  • ¿Cómo cambiar la fuente de fuente de elemento de menú actionbarsherlock cuando se utiliza tema personalizado para la barra de acción?
  • Android OutOfMemory pero con memoria de sobra
  • Android - Parse JS generó urls con JSOUP
  • Por qué y cuándo anular el registro de observadores de contenido en android
  • ¿Hay una manera de decodificar un archivo .ICO a una resolución mayor que 16x16?
  • File.list () devuelve los archivos en un orden diferente para 4.0 que 2.2
  • Los textos de los botones desaparecen en KitKat (API nivel 19)
  • Trigger galaxia S4 sensor de infrarrojos de desarrollo de aplicaciones?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.