zoukankan      html  css  js  c++  java
  • 类一定是在使用的时候才会被加载的么?

    类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误

    我们都知道类如果有其父类,或者说有实现的相关接口,那么优先加载相应的父类或接下。但是除了这种情况,还有以下几种情况类也会被加载。

    添加虚拟机参数:-verbose:class

    第1种情况:调用某个方法,调用的方法内部会使用到某个类

    public class ReloadTest {
    
        public static void main(String[] args)  {
            System.out.println("----------开始执行main方法----------");
            // 调用test方法开始使用PrintTest类
            test();
        }
        
        public static void test() {
            System.out.println(PrintTest.class.getClass());
        }
    
    }

    但是下面这种情况下是不会加载这个类的

    main方法不做任何操作,即不使用PrintTest这个类,当然也不会加载这个类的

    public class ReloadTest {
        static {
            System.out.println("----------开始执行static 代码块----------");
        }
    
        public static void main(String[] args) {
        }
        
        public static void test() {
            System.out.println(PrintTest.class);
        }
    
    }

    第2种情况:将PrintTest类作为方法的返回类型

    public class ReloadTest {
        static {
            System.out.println("----------开始执行static 代码块----------");
        }
        
        public static void main(String[] args) {
        }
        
        public PrintTest test() {
            return null;
        }
    }

    来看一下控制台输出:

  • 相关阅读:
    [Qt]《开发指南》3.1源码分析
    [c++] 头文件
    [Qt] 信号和槽
    [Qt] 编译问题
    [Qt] 项处理组件
    MYSQL 之 JDBC(十三):处理事务
    MYSQL 之 JDBC(十二): 处理Blob
    MYSQL 之 JDBC(十一): JDBC获取插入记录的主键值
    MYSQL 之 JDBC(十): JDBC的元数据
    MYSQL 之 JDBC(九):增删改查(七)DAO的补充和重构
  • 原文地址:https://www.cnblogs.com/caoxb/p/12735542.html
Copyright © 2011-2022 走看看