• Class.forName("ClassName")与ClassName.class的区别


      引发问题的来源:最近在看比较深入的JVM相关的书,不得不感慨,JVM确实是比较深奥,很多地方难以理解不说,在网上还找不到什么资料,发现一个左思右想都想不明白的问题上网来搜索,结果基本上都是从书上copy下来的东西,还是不能理解。

      问题的出现:今天突然想到一个这样的问题,就是类变量也就是静态变量的初始化问题。以前的范范理解是静态变量在类加载的时候就会初始化,反正是在初始化堆内存的之前会初始化静态变量,知道是这么一回事,但是不知其所以然。因为类加载其实也是有很多个步骤的,比如加载-连接-初始化。以前理解的类加载的意思就有点歧义,究竟是加载-连接叫做类加载还是仅仅是加载-连接这其中的加载呢?我们知道Class.forName("ClassName")与ClassName.class都会返回一个类的Class对象(这个东西不好理解,但是一旦理解了这玩意,对Java的反射机制的理解就又会上升一个高度),但是这两个有什么区别呢?

      带着这两个问题,上网查了一下,然后自己写了测试代码来测试。

      1.定义一个类MyClass:里面有一个内部内,还有一个静态变量和一个静态代码块。

    public class MyClass {
    
        static InnerClass in = new InnerClass();
    
        static {
            System.out.println("static block");
        }
    
        static class InnerClass {
            static {
                System.out.println("inner");
            }
        }
    }

      2.测试代码:

    @SuppressWarnings("all")
    public class MyClassTest {
        @Test
        public void testMyClass() {
            try {
                Class c1 = MyClass.class;
                // 没有任何输出
                Class c2 = Class.forName("chain.MyClass");
                // 输出:
                // inner
                // static block
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

      根据输出结果可以发现:.class仅仅是把类加载进JVM而没有做类的初始化,而forName的形式是初始化了类的(包括初始化静态变量和静态代码快),他们都进行类加载,唯一区别就是初始化类变量与否,这是第二个问题的答案,第一个问题的答案显而易见,我以前理解的静态变量的加载其实是进行的是forName的结果。

      

  • 相关阅读:
    HDU 5963 朋友
    BZOJ 4805 欧拉函数求和
    BZOJ 2153 设计铁路
    BZOJ 2631 tree
    BZOJ 4804 欧拉心算
    BZOJ 4806 炮
    BZOJ 3774 最优选择
    BZOJ 4800 Ice Hockey World Championship
    BZOJ 3894 文理分科
    北方大学多校联合训练第十一场E:Modules
  • 原文地址:https://www.cnblogs.com/dreamroute/p/3933979.html
Copyright © 2020-2023  润新知