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的基本操作,还能深入了解其内部机制,为构建...
《Netty源码深入剖析》一书旨在帮助读者深入了解Netty框架的工作原理和技术细节,从基础知识入手,逐步过渡到高级优化技巧,使开发者能够更好地掌握并应用Netty于实际项目中。 ### 一、Netty简介与核心特性 Netty...
《深入剖析Tomcat源码》是一本专注于解析Apache Tomcat服务器内部工作原理的书籍,而提供的压缩包文件正是这本书中的源代码示例。Tomcat作为一款广泛应用的开源Java Servlet容器,其源码对于理解Web应用服务器的工作...
通过学习《深入剖析Tomcat》的源码,开发者不仅可以提升对Tomcat工作原理的理解,还能提升解决问题的能力,为解决实际开发中的性能瓶颈和安全问题提供强有力的支持。同时,对Tomcat源码的深入理解也有助于向其他Java...
第7章 React渲染机制:原始渲染VDOM与性能改革Fiber的源码剖析 第8章 React渲染机制:React中初次渲染流程深度剖析 第9章 React渲染机制:页面初次渲染原生标签代码实践 第10章 React渲染机制:手写不同组件的渲染...
《深入剖析Tomcat》中,作者会带领读者逐步探索这些组件的源码,包括Catalina的生命周期管理、Connector的请求处理流程、Executor的线程调度策略等,深入理解Tomcat如何高效地处理并发请求。 **Java和Spring集成** ...
通过对源码的分析,读者可以了解到STL如何在运行时动态调整内存布局以提高效率,如何利用C++的模板机制实现泛型编程,以及如何设计和实现高效的算法。 在学习STL源码的过程中,我们不仅能提升对C++模板机制的理解,...
Spring框架是Java开发中最常用的轻量级框架之一,它的运行机制源码剖析是理解其工作原理的关键。在本文中,我们将深入探讨Spring的核心组件、依赖注入(DI)以及AOP(面向切面编程)的实现。 首先,让我们从Spring...
1. **Python解释器的运行流程**:介绍如何从源代码到字节码,再到机器码的转换过程,包括词法分析、语法解析和编译阶段。 2. **对象系统**:探讨Python中的对象模型,包括对象的创建、生命周期管理、继承和多态性。...
尽管 Chrome 的源码庞大且复杂,但通过对关键组件的深入研究,可以学习到很多关于浏览器设计和实现的宝贵经验。对于任何想深入了解 Web 技术、并发编程或软件架构的开发者来说,Chrome 源码都是一个绝佳的学习资源。
第一部分,深入浅出Netty源码剖析,这一章节将带领学习者逐步揭开Netty的神秘面纱。Netty是Java领域里一个高性能、异步事件驱动的网络应用框架,广泛应用于分布式系统、云计算以及大数据传输等领域。在这一部分,...
源码剖析会深入到Python对象的内存布局,理解对象的创建、属性访问、方法调用以及引用计数等对象机制。 4. Python执行模型: Python程序的执行涉及编译和解释两个过程。剖析Python源码,可以揭示Python解释器如何将...
### STL源码剖析 #### 书籍概述 《STL源码剖析》是一本深度解析C++标准模板库(Standard Template Library, STL)源代码的专业书籍。该书采用简体中文编写,提供了PDF格式的扫描版供读者使用。本书并非面向C++初学...
Spark源码剖析是一门深入探索Apache Spark底层实现原理的课程,其主要内容包括对Spark源码的详细解读和分析。Apache Spark是一个开源的分布式计算系统,提供了快速而通用的计算引擎。1.02版本作为课程的切入点,是一...
《ibatis框架源码剖析》是一本深入探讨mybatis前身——ibatis...通过对源码的深入剖析,我们可以更好地解决实际项目中的问题,进行性能优化,甚至为框架本身做出贡献。这正是《ibatis框架源码剖析》所提供的价值所在。
同时,源码剖析也是许多高级程序员从编程新手向资深开发者转变的重要过程。 在进行Python源码剖析时,首先需要对Python的整体架构有所了解。Python是一门解释型语言,其源代码在执行前不需要编译,但Python虚拟机...
文档描述中提到的内容是FFMPEG源码深入解析的强烈推荐,意味着此文档会涵盖从最基础的概念到高级的实现技术,从整个多媒体框架的设计到各个组件的具体实现。这些内容对多媒体领域的工程师和研究人员来说是十分宝贵的...