“this.this $ 0”是什么意思?

这段代码中“this.this $ 0”是什么意思? 它代表什么? 我知道为什么我们使用“这个”,但我不知道“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)); } } 

Solutions Collecting From Web of "“this.this $ 0”是什么意思?"

this.this $ 0Main.access $ 0相同这些神秘的符号通常对应于匿名的内部类。 Java VM不知道它们,只知道顶级类,因此Java编译器提供了几种解决方法来使内部类可以工作。

本地类具有隐式引用其封闭类的实例,“$ 0”对应于反编译代码中的引用。 JVM阻止类访问其他类的私有方法,因此编译器会生成几个像访问$ 0一样的合成包私有方法,以访问封装实例的私有方法。

Java语言还有许多其他function,这些function是使用generics和协变返回types等合成方法实现的。

我build议你检查这些链接: 解码反编译的Android的源代码

和: 性能提示

没有任何东西可以阻止你(除了像样的命名约定)拥有一个名为this$0的实例成员,然后用this关键字引用它。

例如 :

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

Java 1.1语言规范规定,当为了生成Java虚拟机字节码而转换为Java 1.0代码时,作为类成员的types的名称由内部类的完全限定名组成,除了每个类的全部名称.' character following a class name is replaced by a .' character following a class name is replaced by a $' .' character following a class name is replaced by a 。 另外,每个内部类构造函数都会在前置参数中接收封闭实例。 下面是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]; } } 

任何已经使用Java或C ++适配器类进行编程的人都已经编写了与此类似的代码,除了链接variables必须手动定义并在顶层适配器类中明确初始化之外,而Java 1.1编译器自动为内部类创build它们。

当枚举器需要引用封闭实例的顶部或数组字段时,它通过一个称为$ 0的专用链接进行间接寻址。 这个名称的拼写是将内部类转换为Java 1.0语言的一个强制性部分,所以debugging器和类似工具可以很容易地识别这些链接。 (大多数程序员都快乐地不知道这样的名字。)

(注意:在Java 1.1的某些实现中有一个限制,在这个实现中,这个$ 0的初始化被延迟到运行任何超类构造函数之后,这意味着如果方法碰巧发生了子类方法的上级引用可能会失败由超类的构造函数执行。)