很简单的一个测试类如下:
源码: 编译生成的Class文件:
public class testOuter {
private int a;
private int b;
private void fun() {
a += 1;
}
class testInner {
int x = 0;
testInner() {
b = 1;
a = 0;
fun();
}
}
可以看出,为了使内部类访问外部类的私有成员,编译器生成了形似 "外部类.access$XYZ"的函数。XYZ为数字。X是按照私有成员在内部类出现的顺序递增的。YZ为02的话,标明是基本变量成员;YZ为00的话标明是对象成员或者函数。
记录一下,编译反编译看代码时理解代码!
public class Outer{ // this$0
public class FirstInner{ // this$1
public class SecondInner{ // this$2
public class ThirdInner{
}
}
}
}
java.net.URLClassLoader$1.run 代表的是第一个内部类中的run方法
sun.misc.Launcher$AppClassLoader.loadClass执行了Launcher的内部类AppClassLoader中的loadClass方法
参考文章:http://hi.baidu.com/haoziqi/item/cb743096d54791bc82d2952e