今天同学遇到一个奇怪的问题,让我帮他看,结果发现了一个 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
据说原因是:
写道
当内部类是私有的且没有明确书写公有的构造函数时,那么缺省构造函数就是私有的,javac(SUN JDK 1.4)对这种情况的处理就是创建一个可以访问的带有一个参数的构造函数,而这个参数的类型是一个匿名的静态类,所以编译时就会多生成一个class文件。
解决的办法是:给 InnerClass 加上一个 public 的构造函数,或者去掉 InnerClass 的 private 修饰符。
public class OuterClass {
private InnerClass test = new InnerClass();
private static class InnerClass {
public InnerClass() {
}
}
}
用 Eclipse 编译就没有这个问题。这个问题的麻烦之处就在于:如果用 emma 测覆盖率,那么那个 OuterClass$1 就没办法覆盖到,结果类覆盖率大打折扣。
分享到:
相关推荐
解决javac 不是内部或外部命令问题 javac 命令
javac 源码 javac 源码 javac 源码
记录搭建java环境终端输入 javac显示不是内部命令错误-附件资源
javac 源代码 javac 源代码 javac 源代码 javac 源代码 javac 源代码
文档为中文编写,基本内容是翻译自jdk官网上的。其中个别翻译的更详尽,此文推荐大家参阅。
针对javac不是内部命令的错误,简单有用的java环境变量设置法
jdk7 javac源码
关于javac命令的一些细节,import、package等关键字,classpath选项。不用IDE时怎么组织代码进行编译
javac源码免费下载,欢迎大家下载学习。
java编译的javac.jar
OpenJDK javac1.7源码
jdk安装检验,java能执行,javac不能执行的原因
linux下 Error running javac compiler
javac1.7源代码,从openjdk1.7中剥离,可在eclipse中运行。附环境搭建说明。不成功可私信我。
本资源是java 编译器 javac(java compilor) 的源代码,对于想深入学习 java 工作原理的开发人员来说是一个很好的资源,在此共享,还望喜欢。
这是javac源代码,很多时候,我们使用java语言开发的时候,都知道是通过javac编译的,但是具体的编译过程是怎么样的?就需要通过源码来研究。
ARM.CMSIS.4.5.0ARM.CMSIS.4.5.0ARM.CMSIS.4.5.0ARM.CMSIS.4.5.0
Javac源代码
Eclipse能后运行的javac源码,从openjdk里剥离出来的,用于学习研究!运行不起可以联系我!