今天刚好有同学问了下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. 并发编程7 管道&事件&信号量&进程池(同步和异步方法)

    1,管道 2.事件 3.信号量 4.进程池的介绍&&进程池的map方法&&进程池和多进程的对比 5.进程池的同步方法和异步方法 6.重新解释同步方法和异步方法 7.回调 ...

  2. 目标检测系列 --- RCNN: Rich feature hierarchies for accurate object detection and semantic segmentation Tech report

    目标检测系列 --- RCNN: Rich feature hierarchies for accurate object detection and semantic segmentation Te ...

  3. PageCache 在查询中的作用很大

    百度Elasticsearch-产品描述-介绍-百度云 https://cloud.baidu.com/doc/BES/FAQ.html#.51.46.57.73.73.7E.71.4C.6F.AA. ...

  4. Spring 框架的AOP之注解的方式

    1. 环境搭建 1.1 导入 jar 包 Spring 框架的基本开发包(6个); Spring 的传统AOP的开发包 spring-aop-4.3.10.RELEASE org.aopallianc ...

  5. 实战docker,编写Dockerfile定制tomcat8镜像,实现web应用在线部署

    最初在tomcat上部署web应用的方式,是通过maven的maven-compiler-plugin插件先打成war包,再将war包复制到tomcat的webapps目录下,后来用上了tomcat7 ...

  6. 用Android NDK编译FFmpeg

    附(2018-01-06):     有一个将x264及lame等库集成进去了且基于android的ffmpeg的编译方法,地址参见:       https://github.com/writing ...

  7. Linux定时器 使用

    1.alarm alarm()执行后,进程将继续执行,在后期(alarm以后)的执行过程中将会在seconds秒后收到信号SIGALRM并执行其处理函数. #include <stdio.h&g ...

  8. python全栈开发从入门到放弃之网络基础

    一.操作系统基础 操作系统:(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才 ...

  9. struts2基础——需要注意的几点

    struts是流行和成熟的基于MVC设计模式的web应用程序框架,使用struts可以帮助我们减少运用MVC设计模型来开发web应用的时间. 目录: 一.struts2的工作原理及文件结构 二.三种访 ...

  10. TCP三次“握手”与4次“挥手”

    OSI(Open System Interconnection,开放系统互联)七层网络模型成为开放式系统互联参考模型,是一个把网络通信在逻辑上的定义,也可以理解成为定义了通用的网络通信规范.而我们的数 ...