最近在忙毕业设计,我的题目是《JAVA CLASS LOADING技术研究》。以前没怎么研究过虚拟机,在网上查阅了一下相关的资料。但是还是有些地方不是很理解。特来求助。1.类的加载。这几个字到底该怎么理解呢?是发生在编译的过程中,还是在运行的过程中?类的加载,是指一个对象在创建的时候“加载”类这个模型而创建出一个对象吗?2.关于CLASSLOADER.类的加载器从出生到灭亡,是怎样一个过程呢?跟类的加载有什么联系?怎么理解到一起去?3.如何实例一个CLASSLOADER?刚刚接触,还望高手指点。

解决方案 »

  1.   

    JAVA每个类的编译代码都存在于它自己的独立文件中,该文件只有在需要使用程序代码时才会被加载。一般,类的代码在初次使用时才加载。通常是指直到类的第一个对象被构建时才发生加载,但是当访问static字段或static方法时,也会发生加载。
      

  2.   

    你不妨研究一下java.lang.ClassLoader
      

  3.   

    谢谢各位!通常类的第一个对象被构建时才发生加载,那是不是说再构建第二个对象的时候,类就不再被加载了?那第二个对象是怎么被构造出来的呢?还有就是,在这其中,构造器是怎么发挥自己作用的呢?TO:interpb
    很想和你交流一下,
      

  4.   

    我的理解:类的加载 与 对象的创建(产生类的实例化) 是两个概念,前者必定先于后者发生对象是在堆中创建的,而在此之前,类肯定已经被加载到了某个地方(这个地方是否也在堆中我还不是很清楚,不过我估计也应该是),总之在这个地方保存了该类的定义,你可以理解为类的方法定义和静态成员的值都保存在这里,其实这很容易理解,这些东西在内存中只需要一个副本就够了,总不能创建一个对象(实例化一个类)就把类的方法代码都在内存中复制一次吧,我想JVM没这么弱智,在创建一个对象(实例化一个类)时,会在堆中开辟一个空间给这个对象,用以保存该对象的相关信息,比如实例成员的值,并且至少会保存有指向该对象对应的类在内存中位置的信息,否则怎么访问这个类的方法以及静态成员呢?
      

  5.   

    谢谢bapi!现在我明白了几点:
    1.类的加载是发生在类的运行中的,与类的编译编译过程没有关系。
    2.在JVM中,每一个类都会被classloader加载。包括类加载器本身。还没弄明白的是:
    1.如果说类的加载与对象的实例化没有什么必然的联系,那么,类的加载是发生在第一个对象实例化之前吗?
    2.加载器的工作是在什么时候发生的?Bootstrap是怎么工作的?
    3.我们自己做一个类的加载器,到底有什么意义呢?
      

  6.   

    孙卫琴老师的一本书上写有,你看看(《java面向对象编程》第10章)
      

  7.   

    1.如果说类的加载与对象的实例化没有什么必然的联系,那么,类的加载是发生在第一个对象实例化之前吗?
    这是肯定的,在成功new出一个对象之前,对应的类必然已经成功加载了2.加载器的工作是在什么时候发生的?Bootstrap是怎么工作的?
    参见第1条,以下行为会导致一个类被加载:
    a.第一次访问这个类的静态成员或静态方法
    b.第一次new这个类的对象
    注意上面说的"这个类"也包括该类所处继承链上所有的衍生类,比如B继承自A,在第一次new一个B的时候,如果B类未被加载,则会加载B,同时如果A类也未被加载,还会加载A3.我们自己做一个类的加载器,到底有什么意义呢?
    加载器,还是构造器?
      

  8.   

    对象实例化之前,编辑器会先按照“Import”中提到的类,到内存的某个区域(名字忘了)中查找是否已经加载了这个类。如果发现了,继续执行,未发现,则把他加载进来
      

  9.   

    别听上面的人“瞎说”,
    先把<<深入Java虚拟机(原书第2版)>>这书买回来看完
    中文版地址:
    http://www.china-pub.com/computers/common/info.asp?id=14719Bill Venners维护的网站:
    http://www.artima.com/insidejvm/resources/再看看:
    The JavaTM Virtual Machine Specification:
    http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html再到OpenJDK主页: https://openjdk.dev.java.net/
    把javac、hotspot源码下下来慢慢看。
      

  10.   

    深入Java虚拟机  电子版ttp://download.chinaitlab.com/program/files/9789.html