java程序从源码到运行所经历的过程:
*.java--->编译成*.class--->加载到内存
*.java经过javac.exe编译成*.class,经过类加载器加载到内存(*.class文件被解析并封装成Class类型的一个实例对象),然后这个Class类型的对象 产生无数 具体类型实例对象
由上面过程我们可以得知:对象被new时,其实是从一个 描述者类信息的Class实例对象生成的,即通过它可以访问方法区中的被解析后的class文件的数据结构,它里面有好多引用地址,通过这些地址就能找到方法区中的类成员(属性和方法)。
一些反射与Class文件格式的小问题
(以下摘自http://blog.csdn.net/providence2712/article/details/8708005)
Class文件格式是能被Java虚拟机读取的一种文件格式。
Java编译器可以把Java代码编译成存储字节码的Class文件,但也有一大批可以在Java虚拟机上运行的语言,如Groovy,JRuby,Jython...... 。JRuby等其他语言的编译器一样可以把程序代码编译成Class文件,虚拟机并不关心Class文件的来源是什么语言,所以Class文件格式是独立存在的。只要符合Class文件应有的结构就可以在Java虚拟机种运行。而且Class文件广义来讲应该就是一串二进制字节流,无论以何种形式存在。不一定要是存在磁盘上的.class文件这个形式。
问题一:
那磁盘上的.class文件(Class文件)和内存中的字节码文件对象(Class文件对象)是不是一回事呢?
肯定不是一回事。
解释:
① Java编译器把代码编译成存储字节码的.class文件(Class文件)。现在还不是内存中的对象。
② 然后,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型(现在才是字节码文件对象)。这其实就是类加载,最终产生的是Heap中的代表该类的java.lang.Class对象。
③ 类的生命周期一共有7个阶段。这里只介绍第一个阶段“加载”阶段,虚拟机需要完成的三件事情:
1.通过一个类的全限定名来获取定义此类的二进制字节流。
2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。(Heap中的Class对象就是封装了方法区中的类信息)
3.在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。
④ 例如:磁盘上有个Person.class的Class文件(字节码文件)要变成Java
中可用的Person类型是需要经历虚拟机的类加载机制的。变成了Person类型(一种Class文件对象)才能用new Person()创建对象。
所以说Class文件和Class文件对象(字节码文件对象)是两回事。
问题二:
有人问我说.java和.class文件它们有什么区别?
我回答说没什么太大的区别。它们语义上都是相同的,所以本质上表达的东西是相同的。只不过.java文件是让人看的。.class文件是给虚拟机看的。当然,最终通过虚拟机给处理器看。字节码是一种程序编译后的中间存储格式,来达到平台无关性的目的。
下面是Java中Class类的由来。
Public final class Class<T>
{
...
}
大家知道我们写的类都是从现实生活中抽象而来,对我们程序员来说抽象是一个很重要的概念。
例一:现实生活中的人这类事物很复杂。我们就抽象出一个Java中的类来描述它。所以我们抽象出来的Person类(Person.java Person.class)在经过Java中的类加载机制后成为Java中的一个类型。
例二:那现实生活中的字节码文件(Class文件)也很复杂,所以我们也可以抽象出一个类来描述它,那就是Java中定义的Class类。(请注意区分Class文件格式 和 Java中定义的Class类)
下面的内容只是打个比喻增强大家的理解,但表述不准确。
假设Java中的Class类有N个不同的构造函数,能构造出各种类型。
下面的内容只是打个比喻增强大家的理解,但不是很准确。
我们一直说类(.java .class)就是创建对象的图纸。那么Class类就是对这些图纸的抽象。
Class类就是描述所有图纸的类。
最后对Field,Method,Constructor,Package类的解释:
Class类是整个抽象类文件。但类文件中还有其他的组件。这些组件也有一定复杂性。Java就更进一步把那些组件也抽象成对应的类。
例如:汽车也是一个现实中的对象,但组成汽车对象的还有变速箱,发动机,悬挂系统等也是一个个对象。
相关推荐
tomcat深入剖析 tomcat原理,由浅入深;由老美所写,的翻译版;看完之后有种顿悟的感觉;tomcat深入剖析.pdf+源码(tomcat运行原理)
一本深入剖析Tomcat底层运行机制的书籍,非常适合开发人员。包含有详细的源码示例
希望大家看完这篇文章后能对Spring有更深入的了解,希望这篇文章对你有所帮助
深入剖析 Tomact 电子版,希望对您有用; 主要剖析了 Servlet 容器的内部运行原理!
在深入了解一个系统的原理、实现细节之前,应当先准备好它的源码编译环境、运行环境。如果能在实际环境安装和运行Spark,显然能够提升读者对于Spark的一些感受,对系统能有个大体的印象,有经验的技术人员甚至能够猜...
该资源不仅提供了完整可靠的源码和深入剖析的论文,还附赠了专业的计算机答辩PPT模板,帮助用户从理论到实践,再到成果展示,全程无忧。 在源码方面,该系统采用Java编程语言精心打造,确保了系统的稳定运行和高效...
基于对flink的学习,和对flink源码的简单梳理,从flink on yarn的角度,介绍flink从启动,到提交yarn任务,以及完成整个过程涉及到的进程交互和内存管理等底层逻辑。该资源一共分为4个部分:1、yarn提交流程,2、...
在资源的内容上,本套资料深入剖析了RSA文件加密软件的设计与实现过程。源码部分采用Java编程语言,精心编写而成,确保了软件的稳定可靠运行。通过这套源码,学生可以深入了解RSA算法的原理和实现细节,掌握Java在...
感谢网络前辈的无私分享,再整理一下 WTL 的学习文档。 所有源码都能在 VC6,WTL7.0 下编译通过。 具体内容如下: 1、WTL个性设置demo 文档和源码。...10、深入剖析MFC中对于Windows消息处理、运行机制.doc
VC++深入详解的全部课程目录 第一课:Windows程序运行原理 第二课:掌握C++ 第三课:讲述MFC AppWizard的原理与MFC程序框架的剖析 第四课:MFC消息映射机制的剖析,讲述如何运用ClassWizard 第五课:文本编程 第六课:菜单...
文档语言准确、专业,逻辑连贯,为学习者提供了从理论到实践的全方位指导。通过阅读文档,学习者能够深入理解新闻阅读器的工作原理,掌握开发过程中的关键技术,为实际项目开发打下坚实基础。 运行截图则直观地展示...
论文部分则对邮件收发系统的设计与实现进行了深入剖析和阐述。论文语言专业,逻辑严密,从需求分析、系统设计、实现过程到测试验证等方面进行了全面介绍,为用户理解系统的原理和实现过程提供了有力的理论支持。 ...
对python运行机制进行剖析,适合那些深入了解python的人(不适合新手和刚入门者)
源码结构清晰,逻辑严谨,不仅易于理解,更能为学习者提供从入门到精通的全方位指导。 此外,说明文档对在线网购商城应用的设计理念、技术实现、功能特点等进行了全面而深入的剖析。文档语言专业、准确,逻辑清晰,...
该资源不仅包含完整的源码和详尽的说明文档,还附有一篇深入探讨系统设计与实现的论文,为使用者提供了从理论到实践的全方位指导。 在源码方面,该系统采用了模块化的设计思想,将各个功能模块进行独立封装,使得...
此外,我们还撰写了一篇关于漫画网站设计与实现的论文,从理论和实践两个层面深入剖析了项目的各个环节,有助于学习者全面把握项目要点。 为了方便学习者进行答辩展示,我们还附赠了计算机答辩PPT模板。这些模板...
此外,我们还撰写了一篇关于实习管理系统设计与实现的论文,从理论到实践,深入剖析了系统的设计思路、实现过程以及遇到的问题与解决方案。该论文不仅有助于学习者深入理解系统的实现原理,更能为其在相关领域的研究...
该资源不仅包含了完整的源码和详尽的说明文档,还附有一篇深入探讨系统设计与实现的论文,为使用者提供了从理论到实践的全方位指导。 在技术上,该系统采用了SpringBoot框架,确保了系统的稳定性和可扩展性。源码...
本书以CPython为研究对象,在C代码一级,深入细致地剖析了Python的实现。书中不仅包括了对大量Python内置对象的剖析,更将大量的篇幅用于对Python虚拟机及Python高级特性的剖析。通过此书,读者能够透彻地理解Python...
该系统采用Python编程语言,结合数据爬取、文本分析等技术,对开心麻花影视作品的票房、口碑、剧情、演员表现等多个维度进行了深入剖析。通过数据可视化,系统直观地展示了作品之间的关联性和差异性,帮助用户快速...