标签:方法区 步骤 继承 变量 比较 使用 格式 类变量 jar
加载->(验证->准备->解析)(连接)->初始化->使用->卸载
初始化只有在以下5种情况下被触发:(初始化前面的步骤自然而然发生)
1) new instance, getStatic, putStatic, invokeStatic
2) reflection
3) main()所在类
4) 子类初始化时父类被初始化
5) 动态语言支持,MethodHandle
加载: 根据全定限名加载二进制流(*.class),这提供了很大的灵活性,可以自定义类加载器来加载类。可以从jar,war,网络,动态代理等等加载。然后生成类结构保存到方法区。
验证:因为*.class可以任意编写,确保class文件格式符合一定规范,以及有没有继承final类等。
准备:为类变量提供初始零值(并非初始值)
解析: 将符号引用解析为直接引用
初始化:按程序初始化变量和其他资源
类加载器:
1)Bootstrap: $JAVA_HOME/lib/rt.jar
2) Extension: $JAVA_HOME/lib/ext/*.jar
3) Appliaction: 应用classpath的类
4) 自定义ClassLoader
双亲委派模型:类加载器具有优先级的层次关系,可以保证一个类只有优先级最高的加载器加载(比如Object由BootstrapClassLoader加载),如果用户也在classpath定义了java.lang.Object,那么系统会出现多个Object类,无法保证程序的正确运行。
ClassLoader loadClass():
先检查class是否已经load,如果没有,看parent是否load;
如果到Bootstrap都没load,则由该ClassLoader load该class
判断2个类是否相等(equals(), isAssignableFrom(), isInstance()),需要在ClassLoader的namespace下进行比较。如果ClassLoader不一样,两个类不相等。
标签:方法区 步骤 继承 变量 比较 使用 格式 类变量 jar
原文地址:http://www.cnblogs.com/lruihan/p/6602936.html