今天刚好有同学问了下Java编译后产生的.class文件名的问题,虽然一直都在使用Java做开发,但是之前对编译后产生的.class文件名的规范也基本没做了解过,也真的是忏愧啊!今天无论如何都要总结下。下面是本人今天做的实验

 
1、创建类ClassA,观察产生的.class文件。目的是测试没有任何继承、实现类以及内部类等情况下产生的.class文件以及命名规则
实验结果:
从下图可以看出,只产生了一个.class文件,文件名为类名.class
 
2、创建类ClassB,观察产生的.class文件。目的是测试有实现接口类情况下产生的.class文件以及命名规则
实验结果:
从下图可以看出,只产生了一个.class文件,文件名为类名.class
 
3、创建类ClassC,观察产生的.class文件。目的是测试有继承父类情况下产生的.class文件以及命名规则
实验结果:
从下图可以看出,只产生了一个.class文件,文件名为类名.class
 
对以上3点做个小结:
从以上3个实验来看,编译后产生的.class文件跟它所实现的接口、继承的父类都没有关系,在这些情况下,它都只产生一个.class文件,而且文件名就是类名.class

4、创建类ClassD,定义了一个普通内部类ClassDd,观察产生的.class文件。目的是测试有内部类情况下产生的.class文件以及命名规则
实验结果:
从下图可以看出,产生了2个.class文件,ClassD.class 和 ClassD$ClassDd.class。
这说明产生的.class文件与内部类有关系。外部类产生的文件跟上面的3个实验结果一样,都是类名.class,而内部类,则采用了外部类名$内部类名.class,外部类和内部类名使用符号$隔开
注意:这里的外部类都是相对而言
 
5、创建类ClassD,定义了一个普通内部类ClassDd,再在ClassDd定义它的内部类ClassDdd,观察产生的.class文件。
目的是测试有内部类情况下产生的.class文件以及命名规则
实验结果:
从下图可以看出,产生了3个.class文件,ClassD.class 、 ClassD$ClassDd.class、 ClassD$ClassDd.class$ClassDdd.class。
这个实验结果跟上面的第四个实验是一样的,只是这次的第2层内部类文件是在第1层内部类的基础上增加自己的类名。
注意:这里的外部类都是相对而言
 
 
 
 
对第4和第5个实验做下小结。
以上这两点都是验证有普通内部类情况下产生哪些.class文件以及命名规则如何。最后得出结论如下:
类个数:看定义类的个数,包括外部类和普通的内部类
.class文件名的命名规则:外部类名 + $ + 内部类名 + .class,即等于当层内部类以及每一层外部类的名字叠加,但是每个类之间使用符号$隔开
 
 
 
6、创建类ClassE,定义了一个匿名内部类,观察产生的.class文件。目的是测试有匿名内部类情况下产生的.class文件以及命名规则
实验结果:
从下图可以看出,产生了2个.class文件,ClassE.class 和 ClassE$1.class。
其实这个实验结果跟第4个实验的结果相似,不同的是,内部类由于没有名字,因此采用数字来表示。这数字按照定义的匿名内部类的顺序来一次增加的。
 
 
 
7、创建类ClassF,并在同一个.java文件中定义另外一个类ClassFf,观察产生的.class文件。
目的是同一个.java文件定义的类所产生的.class文件情况
实验结果:
同一个.java文件定义的类所产生的.class文件情况,符合上面上面验证的规范。
 
 
 
 
最后总结:
1、编译后产生的.class文件个数:有多少个类,产生多少个.class文件
 
2、.class文件命名规则:
     2.1普通内部类
           外部类名 + $ + 内部类名 [+ $ + 内部类名 + ...]+ .class,类名之间使用符号$隔开
           例如:ClassD$ClassDd$ClassDdd.class,这里ClassDdd是对底层的普通内部类,它的父类ClassDd,而ClassDd的父类也是最外层的外部类ClassD
     2.2匿名内部类
           外部类名 + $ + 数字 [+ $ + 数字 + ...]+ .class,类名之间使用符号$隔开,数字根据在外部类中定义的顺序决定
           例如:ClassE$1$1.class
 
3、同一个.java文件中定义的其他非public声明的类,都遵循以上2点规范
 
3、继承、或者接口实现,不影响编译产生的.class文件个数和命名规则
 
转自:http://www.cnblogs.com/itmanxgl/p/605b4b093bd8abf5b60ef65749a0857d.html

(转)Java编译后产生class文件的命名规则的更多相关文章

  1. Java编译后产生class文件的命名规则

    今天刚好有同学问了下Java编译后产生的.class文件名的问题,虽然一直都在使用Java做开发,但是之前对编译后产生的.class文件名的规范也基本没做了解过,也真的是忏愧啊!今天无论如何都要总结下 ...

  2. 查看编译后的calss文件编译jdk版本

    使用UtralEdit或者sublime text打开编译后的.class文件, 其中cafe babe为magic number(魔数),标识这个文件是java的class文件. 0033转换成10 ...

  3. weblogic对JSP预编译、weblogic读取JSP编译后的class文件、ant中weblogic.jspc预编译JSP

    我们都知道在weblogic中JSP是每次第一次访问的时候才会编译,这就造成第一次访问某个JSP的时候性能下降,有时候我们也希望JSP被编译成class然后打包在jar中实现隐藏JSP的功能,下面介绍 ...

  4. 转:关于将Java编译过的.class文件打成jar可执行文件/JAR详解

    原文链接:关于将Java编译过的.class文件打成jar可执行文件/JAR详解 如何把 java 程序编译成 .exe 文件.通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像. ...

  5. IDEA中部署tomcat,运行JSP文件,编译后的JSP文件存放地点总结

    首先保证你正常部署了Tomcat,并且正常在浏览器中运行了JSP文件. 那么Tomcat编译后的JSP文件(_jsp.class 和 _jsp.java)的存放地点: (一)一般存放在你安装的Tomc ...

  6. javac 编译引用外部指定jar包进行编译和执行编译后的class文件

    1.libs新建文件夹存放依赖所有jar包 2.cmd 执行: 2.1 javac -encoding UTF-8 -classpath .;C:\Users\chenquan\IdeaProject ...

  7. 【jvm】04-我偷偷改了你编译后的class文件

    [jvm]04-我偷偷改了你编译后的class文件 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请 ...

  8. java编译后字节码解析

    java编译后字节码解析 参考网摘: https://my.oschina.net/indestiny/blog/194260

  9. target存放的是编译后的.class文件地方 默认情况下不会讲非class文件放入进入 如果要使用非.class文件 需要通过增加配置方式自动加入文件

    target存放的是编译后的.class文件地方 默认情况下不会讲非class文件放入进入 如果要使用非.class文件 需要通过增加配置方式自动加入文件

随机推荐

  1. mybatis循环map

    一.循环key <foreach collection="map.keys" item="key" separator="and"&g ...

  2. screen命令在freebsd安装和使用

    安装 # cd /usr/ports/sysutils/screen # make install clean 使用 # screen //以下^A表示同按“Ctrl + A”键 # ^A c //C ...

  3. chardet库:识别文件的编码格式

    chardet库文档 http://chardet.readthedocs.io/en/latest/usage.html 小文件的编码判断 detect函数只需要一个 非unicode字符串参数,返 ...

  4. POJ 2773 Happy 2006(容斥原理+二分)

    Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 10827   Accepted: 3764 Descr ...

  5. 所有版本chromedriver下载

     所有版本chromedriver下载 http://chromedriver.storage.googleapis.com/index.html

  6. Java基础语法 - 面向对象 - this 关键字

    在Java语言中规定使用this关键字来代表本类对象的引用,this关键字被隐式地用于引用对象的成员变量和方法. this关键字引用的就是本类的一个对象,在局部变量或方法参数覆盖了成员变量时,就要添加 ...

  7. 第04章—整合Mybatis

    spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址:https://gitee.com/jinxia ...

  8. IIS 部署WCF时遇到这么个错:

    转(http://blog.csdn.net/vic0228/article/details/48806405) 部署WCF时遇到这么个错: "The service cannot be a ...

  9. 流畅的python 字典和集合

    介绍 dict 类型不但在各种程序里广泛使用,它也是 Python 语言的基石.模块的命名空间.实例的属性和函数的关键字参数中都可以看到字典的身影.跟它有关的内置函数都在 __builtins__._ ...

  10. 001-ant design pro安装、目录结构、项目加载启动【原始、以及idea开发】

    一.概述 1.1.脚手架概念 编程领域中的“脚手架(Scaffolding)”指的是能够快速搭建项目“骨架”的一类工具.例如大多数的React项目都有src,public,webpack配置文件等等, ...