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

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

来自为知笔记(Wiz)

时间: 2024-10-08 15:56:36

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

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

我们都知道在weblogic中JSP是每次第一次访问的时候才会编译,这就造成第一次访问某个JSP的时候性能下降,有时候我们也希望JSP被编译成class然后打包在jar中实现隐藏JSP的功能,下面介绍自己几天来的研究成果.在这里weblogic采用的是weblogic12c. 前提知道JSP编译之后存放的位置在:%base%\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_user\Struts\km2umq\jsp_s

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

使用UtralEdit或者sublime text打开编译后的.class文件, 其中cafe babe为magic number(魔数),标识这个文件是java的class文件. 0033转换成10进制是51(3*16^1+3*16^0).而51则是jdk 1.7.(50是jdk1.6.49为jdk1.5) 而51就是jdk1.7的minor.major version. 延伸:: 下表既是minor.major version表

thinkphp5中上传文件自定义命名规则

在thinkphp5中:有上传文件一章: https://www.kancloud.cn/manual/thinkphp5/155159 如果对于文件上传这一章,不了解,就先看下面的,再来看这一段. 下面我们自定义两个规则. 1.datea规则,年月/时分秒.(3位随机数) /201706/164030789 2.ymmd5规则,年/月/md5 修改框架文件:thinkphp/library/think/File.php. 增加两个case: case 'datea': case 'ymmd5'

Linux系统根文件以及命名规则详解

一.Linux系统根文件详解 Linux的重要哲学思想其实就是:将程序的配置文件保存为纯文本格式. 1./boot:系统启动文件,如:内核文件,iniyrd以及gurb(bootloarder) 2./dev:目录下为设备文件,设备文件又分为块设备和字符设备: 块设备:按数据块随机访问,没有顺序. 字符设备:线性访问,按字符为单位进行. 注:其中背景为黑色,字体为***的文件,为特殊文件,"1,   0"分别为文件的主设备号和次设备号 [[email protected] ~]# ls

Android多语言支持以及各国语言Values文件夹命名规则

创建好的项目工程由于需求 需要做多国语言的支持  下面介绍怎么快捷的创建文件夹 建好一个android 的项目后,默认的res下面 有layout.values.drawable等目录 这些都是程序默认的资源文件目录,如果要实现多语言版本的话,我们就要添加要实现语言的对应的资源文件. 首先我们点击添加Android Xml File按钮,在Resource Type中选择Values 在File中输入string.xml ,会出现下面的界面: 下面 以添加一个 英语(美国):values-en-

svn去除java编译后文件配置

提交SVN的Java代码通常只需要提交源代码,而不需要提交编译后的文件,而每次提交手动去除这些文件十分麻烦,因此可以通过SVN的配置来忽略这些文件. 配置的路径是Settings > General > Global ignore pattern. 如图,只要配置上这些文件的后缀名即可. "再怎么渴望也不会得到,不如趁早放弃." 原文地址:https://www.cnblogs.com/yanggb/p/12322504.html

Java用来进行批量文件重命名,批量提取特定类型文件

原因: 因为在网上下载视频教程,有的名字特别长,一般都是机构或者网站的宣传,不方便直接看到视频的简介,所以做了下面的第一个功能. 因为老师发的课件中,文件夹太多,想把docx都放在同一个文件夹下面,一个一个找出来太麻烦,所以做了第二个功能.       最近刚刚学了Java文件和流的知识,所以正好练练手,这也是自己的第一个exe程序,分享一下哈. (导出jar文件,以及用工具exe4j生成exe文件,这部分省略了哈) 用到的知识: 用到Java中文件,流的知识,以及简单的GUI知识. 功能:  

vc++ 6.0编译后生成的文件

程序在编译后,在目标路径下会生成多个文件 Debug文件夹(*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb),*.cpp,*.dsp,*.ncb,*.plg       *.exe:是生成的可执行文件    *.ilk:当选定渐增型编译连接时,连接器自动生成ILK文件,记录连接信息    *.obj:是目标文件,源程序编译后的产物    *.pch:全称是PreCompiled  Header,就是预先编译好的头文件,在编译时指定/Yu开关时编译器自动生成  

(5)java基础知识-方法、关键字、命名规则、注释

一.方法 方法相当于功能的实现. public   static   int          max    (int num1, int num2)   {....................} 修饰符     返回类型   方法名   方法(参数可以有N个) 方法体 修饰符: 修饰符是可选的,告诉编译器如何调用该方法.这定义了该方法的访问类型. static: 类方法,可通过类名直接调用 返回类型:方法可以返回一个值.returnValueType的值是方法返回的数据类型.有些方法没有返