¿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)); } }
- Error sobre el contexto FLAG_ACTIVITY_NEW_TASK
- ¿Por qué FileOutputStream lanzar FileNotFoundException?
- Aleatoria y temporal
- ¿Cómo puedo interceptar el flujo de audio en un dispositivo Android?
- Estilo editText para android
- ¿Puede Android Studio extraer automáticamente las referencias de un archivo XML de diseño en el archivo de actividad java?
- Play Servicios de ubicación getLastLocation devuelve null
- Android Shared Service?
- cómo determinar si una conexión a Internet está actualmente disponible y activa en un dispositivo android?
- Android Studio: opción de VM no reconocida 'MaxPermSize = 256m'
- ¿Cómo puedo configurar la imagen de fondo con picasso en el código
- ¿Cómo implementar PdfRenderer Zoom y Scroll apoyo?
- Android Camera.takePicture ha fallado
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.)
- ¿Cómo establezco la longitud máxima para la lista desplegable de un hilandero?
- Cualquier buen editor de texto – aplicación de Android – optimizado para los programadores?