classLoader和Class.forName的区别
public class ClassLoaderOrClassForName{ public static void main(String[] args) throws ClassNotFoundException{
ClassLoader loader = ClassLoader.getSystemClassLoader();
Class<?> loadClass = loader.loadClass("TestDiff");
System.out.println("Load Class : " + loadClass.getName());
System.out.println("------");
Class<?> forName = Class.forName("TestDiff");
System.out.println("Class for Name : " + forName.getName());
}
} class TestDiff{
static {
System.out.println("Static Method");
}
} output:
Load Class : TestDiff
------
Static Method
Class for Name : TestDiff
Class.forName方法将类的.class文件加载到jvm的同时会执行static方法块中的内容。
classLoader只会将类的.class文件加载到jvm中,不会执行static中的内容,只有在调用newInstance()方法调用构造函数,创建类的对象。
JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化。
加载阶段会在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的入口
验证阶段主要是为了确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害jvm自身的安全
准备阶段是正式为类变量分配内存并设计类变量的初始值阶段,即在方法区中分配这些变量所使用的内存空间
解析阶段是指虚拟机将常量池中的符号饮用替换为直接应用的过程,符号引用就是class文件中的CONSTANT_Class_info,CONSTANT_Field_info,CONSTANT_Method_info
初始化阶段是类加载最后一个阶段。初始化阶段是执行类构造器<client>方法的过程。<client>方法是由编译器自动收集类中的类变量的赋值操作和静态语句块中的语句合并而成。虚拟机会保证<client>方法执行前,父类的<client>方法已经执行完毕。
JVM提供了3种类加载器
Bootstrap ClassLoader:负责加载JAVA_HOME\lib目录中的,或通过Xbootclasspath参数指定路径中的,且被虚拟机认可的类
Extension ClassLoader:负责加载JAVA_HOME\lib\ext目录中的,或通过java.ext.dirs系统变量指定路径中的类库
Application ClassLoader:负责加载用户路径上的类库
classLoader和Class.forName的区别的更多相关文章
- loadClass和forName 的区别
类的加载方式 1.隐式加载:new 2.显式加载,loadClass,forName 等 loadClass 和 forName的区别 类的装载过程 1.加载:通过classLoader加载class ...
- java加载类的方法1.classloader 2.class.forName()
java加载类的方法1.classloader 2.class.forName() 加载一个类后,是在方法去创建这个类的元信息class对象,在方法区立刻创建.在方法区创建.
- ClassLoader.loadClass()与Class.forName()的区别
ClassLoader.loadClass()与Class.forName()都是反射用来构造类的方法,但是他们的用法还是有一定区别的. 在讲区别之前,我觉得很有不要把类的加载过程在此整理一下. 在J ...
- ClassLoader.loadClass和Class.forName的区别
为什么要把ClassLoader.loadClass(String name)和Class.forName(String name)进行比较呢,因为他们都能在运行时对任意一个类,都能够知道该类的所有属 ...
- ClassLoader.loadClass()与Class.forName()的区别《 转》
ClassLoader.loadClass()与Class.forName()区别: ClassLoader.loadClass()与Class.forName()大家都知道是反射用来构造类的方法,但 ...
- java 类名.class、object.getClass()和Class.forName()的区别 精析
1.介绍 getClass()介绍 java是面向对象语言,即万物皆对象,所有的对象都直接或间接继承自Object类: Object类中有getClass()方法,通过这个方法就可以获得一个实 ...
- java中Class对象详解和类名.class, class.forName(), getClass()区别
一直在想.class和.getClass()的区别,思索良久,有点思绪,然后有网上搜了搜,找到了如下的一篇文章,与大家分享. 原来为就是涉及到Java的反射----- Java反射学习 所谓反射,可以 ...
- 类名.class, class.forName(), getClass()区别
1:Class cl=A.class; JVM将使用类A的类装载器, 将类A装入内存(前提是:类A还没有装入内存),不对类A做类的初始化工作.返回类A的Class的对象. 2:Class cl=对象引 ...
- 【转】 java中Class对象详解和类名.class, class.forName(), getClass()区别
Class对象的生成方式如下: 1.类名.class 说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象 2.Cla ...
随机推荐
- 使用jsdelivr访问github资源
一.新建github库并使用git上传 首先访问https://github.com 新建自己的库 之后使用 git 上传到github 下载git : https://git-for-windows ...
- SqlServer 查看最近执行过的语句
查看系统中最近执行的语句 ST.text AS '执行的SQL语句', QS.execution_count AS '执行次数', QS.total_elapsed_time AS '耗时', QS. ...
- 【分享】谈CSS3中display属性的flex布局
最近在学习微信小程序(重新学习微信小程序),在设计首页布局的时候,新认识了一种布局方式display:flex .guide-top{ height: 36%; display: flex; /*fl ...
- C#用正则表达式替换手机中间几位为*号 代码及解析
/// <summary> /// 替换手机号中间四位为* /// </summary> /// <param name="phoneNo">& ...
- Windows上验证过的一些乱七八糟的笔记
1.Win10安装时报错“windows 无法安装到这个磁盘 gpt分区形式”? 答:shift+f10: https://jingyan.baidu.com/article/08b6a591c82 ...
- Qt核心机制与原理
转: https://blog.csdn.net/light_in_dark/article/details/64125085 ★了解Qt和C++的关系 ★掌握Qt的信号/槽机制的原理和使用方法 ★ ...
- 怎么让html中 还是显示<button> 而不进行编译
toTXT(str) { var RexStr = /\<|\>|\"|\'|\&| | /g str = str.replace(RexStr, ...
- 迁移 Emacs 的自定义设置
在一台电脑上设置好了 Emacs 自定义的许多包和参数,想要便捷地把各项设置迁移到另一台目标电脑,其实是很简便的. 一般情况下,各个package位于 ~/.emacs.d/ 文件夹内,我们需要做的只 ...
- Tsinghua 2018 DSA PA3简要题解
CST2018 3-1-1 Sum (15%) 简单的线段树,单点修改,区间求和. 很简单. CST2018 3-1-2 Max (20%) 高级的线段树. 维护区间最大和,区间和,左边最大和,右边最 ...
- echarts 自适应方法 x和y x2和y2
grid:{ x:65, y:20, x2:30, y2:30},