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 ...
随机推荐
- js 取整 取余
1.取整//保留整数部分parseInt(3/2) // 1 2.向上取整// 向上取整,有小数就整数部分加1Math.ceil(3/2) // 2 3.四舍五入// 四舍五入Math.round(3 ...
- 移动App测试中的最佳做法
一说起软件测试,测试员想到肯定是去检查文件,功能,API,性能并确定软件是否安全,以及关于软件特定部分的其他事项.但是对于移动测试,测试员不得不基于用户移动使用模式考虑移动相关的功能. 本文是基于我的 ...
- 干货!一篇文章集合所有Linux基础命令
1 文件{ls -rtl # 按时间倒叙列出所有目录和文件 ll -rttouch file # 创建空白文件rm -rf 目录名 # 不提示删除非空目录(-r:递归删除 -f强制)dos2unix ...
- Linux虚机安装配置Tomcat
d第一步:下载Tomcat包,网址http://tomcat.apache.org/ 选择tar.gz包下载,并传到虚机中 第二步:解压下载好的Tomcat包 命令:tar -zxvf apache- ...
- 五、Vi和Vim编辑器
1. Vim编辑器: 在Linux下一般使用vi编辑器来编辑文件.vi既可以查看文件也可以编辑文件.三种模式: 命令行.插入.底行模式 切换到命令行模式:按Esc键: 切换到插入模式:按 i .o.a ...
- How to find out which version of tensorflow is installed in my pc? - 如何找出我的电脑中安装了哪个版本的 tensorflow?
I'm using tensorflow and have got some weired issues. I'm told it might be related to the version of ...
- POJ - 3264——Balanced Lineup(入门线段树)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 68466 Accepted: 31752 ...
- 蓝图Blueprint
---恢复内容开始--- 蓝图: flask模块化处理操作和URL的方式 作用: 将不同的功能模块化,实现模块化应用 构建大型应用 优化项目结构 使用步骤 创建蓝图对象 对蓝图对象进行操作(注册路由; ...
- JsonP的实现原理?
动态创建script标签,通过script标签中的src跨域属性,连接对方接口,并将回调函数通过接口传递给对方,对方服务器在准备好数据后再通过调用回调函数并以传递参数的方式将数据返回来.
- JDBCUtils——C3P0
需要导入的包: mysql-connector-java-5.1.37-bin.jar c3p0-0.9.2-pre5.jar mchange-commons-java-0.2.3.jar 如果使用D ...