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

  • Preferencias de listas de Android: ¿tiene un resumen como valor seleccionado?
  • EditText siguiente Teclado del botón
  • Cómo pasar los datos con formato JSON desde un WebView a una página HTML
  • Android Audio - Transmisión de generador de seno-tono comportamiento extraño
  • Utilizar Linkify.addLinks combinar con Html.fromHtml
  • Explicación del método getPixels para un mapa de bits en Android
  • Cómo convertir rgb color a int en java
  • ¿Cómo forzar a la aplicación a crear una miniatura (instantánea) para la lista de aplicaciones recientes?
  • 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.