`
shell_picker
  • 浏览: 16030 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

javac 对于私有内部类的奇怪处理

    博客分类:
  • Java
阅读更多

今天同学遇到一个奇怪的问题,让我帮他看,结果发现了一个 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 就没办法覆盖到,结果类覆盖率大打折扣。

0
2
分享到:
评论

相关推荐

    javac不是内部或外部命令解决

    在IT领域,尤其是在Java开发中,遇到“javac不是内部或外部命令”的错误是一个常见的问题,这通常意味着系统无法识别javac命令,即Java编译器。本文将深入解析这一问题,并提供详细的解决方案,帮助读者理解和掌握...

    javac 源码 javac 源码

    了解 javac 的源码对于深入理解 Java 编译过程以及优化代码性能具有重要意义。 1. **Java 编译过程**: - **词法分析**:javac 首先将源代码分解成一个个称为标记的单元,例如关键字、标识符、常量等。 - **语法...

    javac源码免费下载

    学习javac源码对于Java开发者来说,不仅可以提升对Java编译过程的理解,还能帮助开发自定义编译器插件或理解JDK内部机制。通过分析源码,我们可以了解到如何处理复杂的语法结构、如何进行类型检查,以及如何生成高效...

    javac--------src

    本知识系列将深入探讨“javac”的内部工作机制,帮助开发者更好地理解和优化自己的代码。 【描述】:“javac源码系列……” 这个系列的内容可能涵盖了从源码级别的深入剖析javac的工作流程,包括词法分析、语法...

    Javac内核源码

    Javac 内核源码深入揭示了 Java 编译过程的实现细节,这对于理解 Java 的运行机制、优化代码性能以及进行编译器开发具有重要的学习价值。 在 OpenJDK 6 版本中,Javac 作为开源项目,提供了一个了解 Java 编译器...

    javac 的 源 代 码

    深入理解javac的源代码对于Java程序员来说,不仅能帮助理解编译过程,还能提升编程技能和优化代码的能力。在本文中,我们将探讨javac的工作原理、关键组件以及其在Java开发中的重要性。 一、javac的基本工作流程 1...

    javac源码和运行说明文件.zip

    - 使用Eclipse的调试功能,可以设置断点、单步执行,观察javac编译过程中的内部状态。 5. **学习研究**: - 通过阅读源码,了解javac如何处理语法错误、类型检查以及优化过程。 - 分析特定功能的实现,如注解...

    记录搭建java环境终端输入 javac显示不是内部命令错误-附件资源

    记录搭建java环境终端输入 javac显示不是内部命令错误-附件资源

    jdk9_javac.rar

    另外,JDK9的javac还支持了一些新的语法特性,比如私有接口方法(Private Interface Methods)和局部变量类型推断(Local Variable Type Inference,即var关键字)。这些新特性使得代码更加简洁,提高了开发效率。 ...

    javac的一些细节

    ### javac的一些细节 #### 一、包与目录结构 **包的作用:** 包(`package`)在Java中主要用于组织类,使得类之间能够更好地进行分组与管理,同时也提供了一种访问控制机制。 **如何指定包路径:** 当你在Java...

    javac_可以编译目录.rar

    3. **源码增强**:在 JDK 9 中,javac 支持更多的语言特性,例如私有接口方法(private interface methods)、局部变量类型推断(Local Variable Type Inference,即 var 关键字)等。这些新特性使得代码更加简洁且...

    javac源代码,java具体编译步骤

    8. **依赖处理**:如果源代码中引用了其他类,`javac`会递归地编译这些依赖的类,确保所有需要的类都被正确编译。 理解`javac`的编译步骤对于深入学习Java和优化代码性能至关重要。通过阅读`javac`的源代码,开发者...

    javac 编译器源代码

    深入了解 javac 的源代码,对于 Java 开发者而言,是提高技术水平、探究语言机制、优化编译过程的关键步骤。 首先,我们来了解一下 Java 编译器的基本工作流程: 1. **词法分析**:javac 首先读取源代码文件,将其...

    javac.jar

    `javac.jar` 是 OpenJDK 中 `javac` 编译器的源码包,它揭示了 Java 编译过程的内部工作原理,对于学习 Java 编译器的工作机制、优化代码性能以及进行自定义编译器开发具有重要意义。 在 OpenJDK 的 `javac1.7` ...

    Using the ant javac adapter

    适配器允许你指定一个类来实现自定义的编译逻辑,这在处理特殊需求时非常有用。 在描述中提到的博客链接已经失效,无法直接获取详细内容。但是,通常情况下,这篇博客可能会讲解如何配置Ant的`<javac>`任务,包括...

    javac命令的使用(含有包名)

    在实际开发中,我们通常会使用构建工具如Maven或Gradle来自动化这些过程,它们会处理类路径设置和编译任务,使得开发更加便捷。 在压缩包文件`javac指令的使用(含有包名)`中,你可以找到这个例子的源码和运行结果...

    javac1.7源代码(完全版,可运行)

    通过阅读和分析javac的源代码,你可以了解到Java编译器如何处理语法错误、类型检查、优化和生成字节码等核心功能。这对于提升Java编程技能、理解编译原理和开发自定义编译器或编译插件都十分有帮助。 **标签相关...

    Javac测试题123456

    静态嵌套类(Static Nested Class)类似于普通的类,可以有自己的静态成员,而内部类(Inner Class)需要依赖外部类的实例,不能有静态成员。 【HashMap与Hashtable】 HashMap是非同步的,允许null键和null值,而...

    javac.zip 总之就是这个样子的了,要看的话可以直接下载看看

    综合来看,这个压缩包对于那些正在学习Java,特别是想要深入了解`javac`编译器的初学者,或者希望回顾和巩固Java基础知识的开发者来说,是非常有价值的资源。它可能提供了一种实践性的学习路径,通过作者的个人经验...

Global site tag (gtag.js) - Google Analytics