运行:
javac ReflectionTest.java
java ReflectionTest 'Student$Counting'
输出为:
class Student$Counting {
public Student$Counting(Student, int);
public void actionPerformed(java.awt.event.ActionEvent);
private int step;
private int num;
final Student this$0;
}
然后再结合该类的反编译的结果图, 就可以发现通过在构造函数中增加Student变量, 并且赋值给了 final Student this$0, 这就解释了 为什么在内部类中能够访问外部类的成员变量 , 但是又为什么在内部类中能够访问 外部类的私有变量 呢?
让我们来看一下Student$Counting中另一处神奇的地方.
System.out.println(Student.access$000(this.this$0) + " count: " + this.num);
可见, Student类中又多了一个成员函数, 但是在Java Decompiler软件的结果中并没有发现, 于是再次采用了ReflectionTest, 其结果为:
class Student {
public Student(java.lang.String);
public void startCount(int);
static java.lang.String access$000(Student);
private java.lang.String name;
}
可见编译后的Student中出现了一个新的静态方法, 我们可以很容易的猜测到该静态方法的实现类似如下:
static String access$000(Student s) {
return name;
}
编译器通过这样的方式实现了从一个类中访问另一个类的私有变量, 那么通过直接修改class文件, 使得获取或改变类中的私有变量成为了可能, 当然要进行实现需要更强大的能力了.