美文网首页
2018-11-19

2018-11-19

作者: 昨日__ | 来源:发表于2018-11-21 14:38 被阅读0次

    jvm中Class装载系统

    • Class文件加载过程
    • ClassLoader的工作模式
    1. 文件加载过程
      加载----->连接----->初始化
      其中连接过程包括验证、准备、解析
      1.1 类装载的条件
      • 创建一个类的实例时,使用new 或者反射、克隆、反序列化
      • 当调用类的静态方法时,及当使用了字节码invokestatic指令
      • 当使用类或者接口的静态字段时(final常量除外),如getstatic putstatic指令
      • 使用java.lang.reflect包中的方法反射类的方法时
      • 当初始化子类时,要求先初始化化父类
      • 作为启动虚拟机,还有main()方法的那个类
        以上几种属于主动使用情况。被动使用不会引起类的初始化。
        一个主动引用的例子:
    public class Parents{
    static{
      System.out.println("init parent");
      }
    }
    public class Child extends Parents{
    static {
      System.out.println("init child");
      }
    }
    public class Test{
    public static void main(String[] args){
           Child  c = new Child();
    }
    }
    

    会有如下的输出

    init parent
    init child
    

    可知系统首先装载Parent,然后装载Child。可以看出符合主动装载的两个条件:使用new 及初始化子类时,必须先初始化父类。
    一个被动引用的例子

    public class Parents{
    static{
      System.out.println("init parent");
      }
       public static int a=10;
    }
    public class Child extends Parents{
    static {
      System.out.println("init child");
      }
    }
    public class Test{
    public static void main(String[] args){
           System.out.println(Child.v);
    }
    }
    

    输出结果为:

    init parent
    10
    

    可知引用一个字段时,只有直接定义该字段的类,才会被初始化。

    相关文章

      网友评论

          本文标题:2018-11-19

          本文链接:https://www.haomeiwen.com/subject/kpkafqtx.html