想问问加载类到底是做些什么事啊?
  
   我知道加载跟初始化是两回事,
    但还请教前辈们他们到底都干些什么呢?   谢谢

解决方案 »

  1.   

    我不能讲得很清楚深入,建议 查看 <<深入java 虚拟机>> 这本书上讲得清楚
      

  2.   

    答:以下是凭头脑中的一点记忆与理解写下的,可能不是很正确。(具体去看《JVM规范》)
    大致是:
    一、类的装载
    大致有:
    1)将类的代码从源(硬盘、网络、内存中的字节数组等等)装载入内存,创建该类在内存中的表示映像。若该类有父类且没有装入,则还要装入父类,以及父类的父类
    2)连接。大致有:
    a)验证类字节码(如:结构上正确否;以及其它强制性遵守的规则)。
    b)准备。如:对类中的static数据成员分配空间,并初始化成它们的默认值(注:这个初始化不是指:类的初始化。初始化成它们的默认值不会执行任何JVM机器指令的)
    c)解析。对运行时常量池中称号引用进行解析。(如:若引用到其它类或接口,则要进行一步装载这些类或接口)分为:数据成员解析、方法解析等。
    d)访问控制处理。二、类初始化:哪些操作会引起类的初始化操作?(如果类还没有初始化)
    大致有:
    1)new 生成该类或子类的对象
    2)读/写该类的static型数据成员
    3)调用该类的static方法。
    4)通过反射类中的方法,如:Constructor对象中的newInstance(...)方法。
    5)JVM启动时自动装入的一些类(如:自动装载入java.io.Serializable接口)
      

  3.   

    类的初始化其实就是执行类中的static{...}代码块而已。类中定义的如:
    static int si=20;
    这样的static数据成员的初始化代码其实编译时都已“移到”上边的static{...}中了。因此:类的初始化是要执行JVM指令的。与上边“2)中b)准备”中的“对类中的static数据成员分配空间,并初始化成它们的默认值”是不同的。