黑马程序员技术交流社区

标题: 对 反射的一些猜想?大家来看看 [打印本页]

作者: XinWen    时间: 2014-5-4 09:49
标题: 对 反射的一些猜想?大家来看看
学习C语言的时候,程序从源代码到可执行文件需要两步,编译,连接。编译个人理解是对源代码的第一步简化,也就是第一步像二进制代码靠近,刚开始我考虑着,为什么不直接把文件编译成二进制代码,非要在中间加个链接的过程。后来明白了,这是为了多个文件,或者不同时段写的文件,也能够被组织成一个可执行文件。最初的编译虽然不能执行,但是他已经对源文件进行了相当大部分的处理。而且仍然保留了成设计时的一些必要信息。以便于后期其他的连接操作。
而对于java 没有连接过程只有编译过程。而且java最后编译的 class文件确实也包含着关于里面代码段的一些信息。反过来想,虚拟机在在执行代码的时候,代码中是不应该包含那些 关于 代码中 方法或者变量的相关信息的数据的,因为这些是不能执行的,虚拟机能够执行的最终文件应该只有代码和要存取的内存单元的地址。 后来学到反射的时候,需要由 class文件 new 一个对象出来,所谓的这个new 是不是 就完成了程序的连接 部分?
作者: Lin0411    时间: 2014-5-4 11:45
java虚拟机在new一个对象的时候其实做了很多工作,首相将类的.class文件加载进内存,然后执行静态代码快和加载方法和静态变量到方法区中,接着才是为对象在堆中分配空间,然后是一些列的属性,构造代码快和构造函数的初始化。在main函数中持有对每个对象的引用,通过引用定位到相应对空间,并根据实例的应用定位到方法区中的函数,注意,一个类的函数在方法区中只有一个拷贝,跟创建了多少个对象无关。不同的类创建的对象都放在了java虚拟机的堆空间中,每个对象实例又可定位到方法区中,而栈中main方法拿到实例的引用,这样JVM就实现了一个动态链接的过程。而如果是c语言的话,还要去组织各代码之间的结构关系,编译之后,根据层次关系进行连接。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2