博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Class.forName("ClassName")与ClassName.class的区别
阅读量:5927 次
发布时间:2019-06-19

本文共 1303 字,大约阅读时间需要 4 分钟。

  引发问题的来源:最近在看比较深入的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的结果。

  

转载于:https://www.cnblogs.com/dreamroute/p/3933979.html

你可能感兴趣的文章
前端和 SEO
查看>>
读书笔记《深入理解java虚拟机》——对象的创建
查看>>
typeof、instanceof、constructor...
查看>>
ES6 数组去重,求交并差集
查看>>
阿里开发者们的第18个感悟:每次困难出现时,就是成长的机会出现了
查看>>
记录一次MySQL两千万数据的大表优化解决过程,提供三种解决方案
查看>>
App Store 隐私政策网址(URL)
查看>>
人工智能影响职业选择 创造力对找工作极为重要
查看>>
WIFI搜索的到别人,却找不到自己家的wifi
查看>>
Yii提示信息跳转页面
查看>>
我的友情链接
查看>>
在线框架引用|bootstrap|jq|jqmobile|CSS框架_无需整理
查看>>
Ansible自动化安装nginx
查看>>
office2013 excel 打开时提示excel词典xllex.dll文件丢失或损坏
查看>>
链接/Redis
查看>>
PHPWAMP强行脱离依赖,在系统缺失必备组件或DLL受损的情况下依然能正常运行
查看>>
Linux守护进程(init.d和xinetd)
查看>>
AWK--Round函数
查看>>
Nagios监控软件源码安装
查看>>
二维观察---规范化和视口变换
查看>>