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的结果。
Class.forName("ClassName")与ClassName.class的区别的更多相关文章
- Class.forName(String className)这个方法的作用
Class.forName(String className)这个方法的作用 解答:通过类的全名获得该类的类对象
- PHPExcel导入导出 若在thinkPHP3.2中使用(无论实例还是静态调用(如new classname或classname::function)都必须加反斜杠,因3.2就命名空间,如/classname
php利用PHPExcel类导出导入Excel用法 来源: 时间:2013-09-05 19:26:56 阅读数: 分享到: 16 [导读] PHPExcel类是php一个excel表格处理插 ...
- js实现addClass方法,classList与className有什么区别?
壹 ❀ 引 Jquery中addClass与removeClass是两个使用高频的方法,对于为dom元素增删class类非常方便:但如果不用JQ,使用js怎么模拟它们呢?本文主要记录下自己的实现思路 ...
- $(document).on('click','.classname',function(){}); VS $('.classname').on('click',function(){});
jquery中用on来绑定事件,经常的写法有$(document).on('click','.classname',function(){});$('.classname').on('click',f ...
- JavaScript之ClassName属性学习
在前面的style属性学习中,知道了通过style属性可以控制元素的样式,从而实现了行为层通过DOM的style属性去干预变现层显示的目地,但是这种就是不好的,而且为了实现通过DOM脚本设置的样式,你 ...
- classname 就是在css上添加类,然后js的类名等于
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" ...
- 添加以及删除className
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- JS的className,字体放大缩小
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- js改变或添加className
js改变或添加className <style type="text/css"> .newDiv { font-weight: bold; } </style&g ...
随机推荐
- OpenGL学习笔记:拾取与选择
转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当 ...
- Android java判断字符串包含某个字符段(或替换)
String str = "; ) { System.out.println("包含该字符串"); }
- 最近在研究电台类app,分享2个源码大家一起讨论
好像去年有一阵,电台类的app特别火爆,喜马拉雅和蜻蜓FM互相还撕逼.听老罗,听好好说话,都得在电台app里,所以我想研究研究这些app.我没那么多资源,只好从app的开发架构方面去研究. 我看api ...
- 关于C、OC、C++、OC++、Swift的一些常识
关于C.OC.C++.OC++.Swift的一些常识 OC是C语言的一个超集,是一门面向对象的语言,因为苹果的崛起而火,API主要是cocoa(OSX)和cocoatouch(iOS),GCC 和 C ...
- javascript设计模式学习之十六——状态模式
一.状态模式的定义 状态模式的关键是区分事务内部和外部的状态,事务内部状态改变往往会带来事务的行为改变. 状态模式中有意思的一点是,一般我们谈到封装,都是优先封装对象的行为,而非对象的状态.但在状态模 ...
- javascript实例学习之一——联动下拉框
经常碰到这样的需求,如省市_城市_乡镇下拉框.后一个下拉框的内容会根据前一个的改变而改变,之前的解决方法往往是在前一个改变的时候,向后台发送请求临时获取对应的内容.这样每触发一次就会网络请求一次,这种 ...
- MyCat:在.NET Core中使用MyCat
http://www.cnblogs.com/yuangang/p/5830716.html
- Browserify
NodeJS 把 JavaScript 的使用从浏览器端扩展到了服务器端,使得前端开发人员可以用熟悉的语言编写服务器端代码.这一变化使得 NodeJS 很快就流行起来.在 NodeJS 社区中有非常多 ...
- hdu 2892 Area
http://acm.hdu.edu.cn/showproblem.php?pid=2892 解题思路: 求多边形与圆的相交的面积是多少. 以圆心为顶点,将多边形划分为n个三角形. 接下来就求出每个三 ...
- 最大权闭合图最大获益(把边抽象为点)HDU3879
题意:给出一个无向图,每个点都有点权值代表花费,每条边都有利益值,代表形成这条边就可以获得e[i]的利益,问选择那些点可以获得最大利益是多少? 分析:把边抽象成点,s与该点建边,容量是利益值,每个点与 ...