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 = MyClassTest.class;
            // 没有任何输出
            Class c2 = Class.forName("chain.MyClass");
            // 输出:
            // inner
            // static block
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

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

  

时间: 2024-10-16 22:13:03

Class.forName("ClassName")与ClassName.class的区别的相关文章

JavaScript基础 为一个标记添加className pObj.className

镇场诗: 清心感悟智慧语,不着世间名与利.学水处下纳百川,舍尽贡高我慢意. 学有小成返哺根,愿铸一良心博客.诚心于此写经验,愿见文者得启发.------------------------------------------ code: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"

classname 就是在css上添加类,然后js的类名等于

  <!DOCTYPE HTML>   <html>   <head>   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">   <title>无标题文档</title>   <script>   window.onload = function (){   var oBtn1 = document

js-DOM-css的className相关

1.在非标准的浏览器,IE8及以下的浏览器不支持className的操作,包括getElementByClassName,addClassName,removeClassName;  2.getElementByClassName处理兼容的方法: var aLi=getElementByClassName(document,'box');//如果多一个限制元素范围的形式为:getElementByClassName(document,'box','li'); function getElemen

[ javascript ] getElementsByClassName与className和getAttribute!

对于javascript中的getElementsByClassName 在IE 6/7/8 不支持问题. 那么需要模拟出getElementsByClassName  需要采用className属性,这里就涉及到javascript中的getAttribute问题. 在ie 6/7 中,对于getAttribute存在Bug 需要采用className 获取如下: var node = document.getElementById("test"); var name = node.

Extjs 源码分析EXTJS 预处理器之className

Class.registerPreprocessor('className', function(cls, data) { if (data.$className) { cls.$className = data.$className; //<debug> cls.displayName = cls.$className; //</debug> } //<debug> Ext.classSystemMonitor && Ext.classSystemMo

js改变或添加className

<style type="text/css"> .newDiv { font-weight: bold; } </style> js和html <script> function clk() { var parent = document.getElementById("parent"); // parent.className = parent.className + " newDiv"; //添加class

JS——DOM操作(className属性)

简单介绍className: className 属性:设置或返回元素的 class 属性 看下面一个简单的例子(给className设置样式变化案例),效果如下图: 代码如下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="

理解class.forName() ---使用jdbc方式链接数据库时会经常看到这句代码

目录(?)[-] 官方文档 类装载 两种装载方法的区别 不同的类装载器 是否实例化类 在jdbc链接数据库中的应用 资源 原文地址:http://yanwushu.sinaapp.com/class_forname/ 使用jdbc方式链接数据库时会经常看到这句代码:Class.forName(String className).本文将浅显地解读这句代码的含义.看这篇文章之前应该对java的反射机制有所了解,至少是对Class类有一定的了解. 官方文档 初始化参数指定的类,并且返回此类对应的Cla

class.forName的官方用法说明

原文地址:http://yanwushu.sinaapp.com/class_forname/ 使用jdbc方式链接数据库时会经常看到这句代码:Class.forName(String className).本文将浅显地解读这句代码的含义.看这篇文章之前应该对java的反射机制有所了解,至少是对Class类有一定的了解. 官方文档 初始化参数指定的类,并且返回此类对应的Class 对象(不了解Class类的同志,应该首先查看下java反射相关知识).例如,以下代码片段返回 java.lang.T