今天同学遇到一个奇怪的问题,让我帮他看,结果发现了一个 javac 的处理小 bug 。
看这段代码:
public class OuterClass {
private InnerClass test = new InnerClass();
private static class InnerClass {
}
}
你可能认为,这段代码编译之后,会生成两个 class 文件:OuterClass.class 和 OuterClass$InnerClass.class 。但事实是,还会多生成一个 OuterClass$1.class ,即使去掉 static 修饰符也是这样的。为什么会这样呢?
我经过上网查找,找到的讨论:
http://hi.baidu.com/digno/blog/item/cd894a630511a16a0c33faa5.html
http://72.5.124.102/thread.jspa?threadID=277695&tstart=9117
http://forums.sun.com/thread.jspa?threadID=594503
据说原因是:
解决的办法是:给 InnerClass 加上一个 public 的构造函数,或者去掉 InnerClass 的 private 修饰符。
public class OuterClass {
private InnerClass test = new InnerClass();
private static class InnerClass {
public InnerClass() {
}
}
}
用 Eclipse 编译就没有这个问题。这个问题的麻烦之处就在于:如果用 emma 测覆盖率,那么那个 OuterClass$1 就没办法覆盖到,结果类覆盖率大打折扣。
本文探讨了Java内部类在特定条件下编译时产生的一个小bug,即除了预期的类文件外,还会额外生成一个未预料的类文件。该现象与内部类的访问修饰符和构造函数有关,并提供了解决方案。
2905

被折叠的 条评论
为什么被折叠?



