今天刚好有同学问了下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文件个数和命名规则
 

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

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

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

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

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

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

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

  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. 使用notepad++进行替换

    将 aaa bbb ccc 转化为 #define AAA aaa #define BBB bbb #define CCC ccc 查找(.*),替换为#define $1 "$1" ...

  2. EXPDP/IMPDP与EXP/IMP在不同用户和表空间之间迁移数据的实现方法

    1. EXPDP/IMPDP方式 SQL> create user zlm identified by zlm; User created. SQL> grant connect,reso ...

  3. 退出app 退出应用程序

    退出app的两种方式1   创建activity的基类,让所有的activity都继承该基类,在基类中创建一个静态的activity列表,并在oncreate方法添加该activity,在退出时,遍历 ...

  4. 协议名称处理函数xxxprotoxxx()

    为了方便操作,Linux提供了一组用于查询协议的值及名称的函数. xxxprotoxxx()函数: 上面的函数对文件/etc/protocols中的记录进行操作,文件中记录了协议的名称.值和别名等值, ...

  5. C++(一)——HelloWorld

    之前学C.学Python,学的比較多的是Java,作为大家口中更强大的C++,要学学,这次的话,以了解主要的特性和做个小游戏作为目标吧. 1)HelloWorld Eclipse执行C++之Launc ...

  6. 安卓手机GPU OpenCL总结(转)

    前段时间,把市面上手机GPU OpenCL支持情况做了一个总结.总结如下: 目前,手机 GPU 市面有四个公司产品:Qualcomm, Imagination Technologies,ARM, Vi ...

  7. webp转jpg

      webp转jpg CreateTime--2017年12月8日09:32:38 Author:Marydon 1.webp格式介绍 WebP 的优势体现在它具有更优的图像数据压缩算法,能带来更小的 ...

  8. knockoutjs -- applyBinding & Observables

    applyBindings ko.applyBindings(myViewModel); // Knockout调用applyBindings激活myViewModel(即把myViewModel和V ...

  9. Wince6.0模拟器下载和使用方法

    原文地址:http://www.oogps.com/post/Wince6.0.html下载地址:Wince6.0模拟器下载.rar 第一步:把软件下载解压后看到以下目录. 第二步:双击运行上图中的S ...

  10. spring各种邮件发送

    参考地址一 参考地址二 参考地址三 参考地址四 Spring邮件抽象层的主要包为org.springframework.mail.它包括了发送电子邮件的主要接口MailSender,和值对象Simpl ...