文档章节

Class.forName和ClassLoader.loadClass区别

蚂蚁蚂蚁
 蚂蚁蚂蚁
发布于 2017/04/06 15:46
字数 533
阅读 2
收藏 0

Java中class是如何加载到JVM中的:
1.class加载到JVM中有三个步骤
    装载:(loading)找到class对应的字节码文件。
    连接:(linking)将对应的字节码文件读入到JVM中。
    初始化:(initializing)对class做相应的初始化动作。
2.Java中两种加载class到JVM中的方式
    2.1:Class.forName("className");
        其实这种方法调运的是:Class.forName(className, true, ClassLoader.getCallerClassLoader())方法
        参数一:className,需要加载的类的名称。
        参数二:true,是否对class进行初始化(需要initialize)
        参数三:classLoader,对应的类加载器

    2.2:ClassLoader.laodClass("className");
        其实这种方法调运的是:ClassLoader.loadClass(name, false)方法
        参数一:name,需要加载的类的名称
        参数二:false,这个类加载以后是否需要去连接(不需要linking)
        
    2.3:两种方式的区别
        forName("")得到的class是已经初始化完成的
        loadClass("")得到的class是还没有连接的
        一般情况下,这两个方法效果一样,都能装载Class。
        但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了。

3.举例说明他们各自的使用方法
    java使用JDBC连接数据库时候,我们首先需要加载数据库驱动。
    Class.forName("com.MySQL.jdbc.Driver");//通过这种方式将驱动注册到驱动管理器上
    Connection conn = DriverManager.getConnection("url","userName","password");//通过驱动管理器获得相应的连接
    查看com.mysql.jdbc.Driver源码:

public class Driver extends NonRegisteringDriver
  implements java.sql.Driver
{
    //注意,这里有一个static的代码块,这个代码块将会在class初始化的时候执行
  static
  {
    try
    {
        //将这个驱动Driver注册到驱动管理器上
      DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
      throw new RuntimeException("Can't register driver!");
    }
  }
}

Class.forName("com.mysql.jdbc.Driver")方法以后,他会进行class的初始化,执行static代码块。
    也就是说class初始化以后,就会将驱注册到DriverManageer上,之后才能通过DriverManager去获取相应的连接。
    但是要是我们使用ClassLoader.loadClass(com.mysql.jdbc.Driver)的话,不会link,更也不会初始化class。
    相应的就不会回将Driver注册到DriverManager上面,所以肯定不能通过DriverManager获取相应的连接。

本文转载自:http://blog.csdn.net/zhengbo0/article/details/39479053

共有 人打赏支持
下一篇: id生成
蚂蚁蚂蚁
粉丝 4
博文 16
码字总数 9797
作品 0
虹口
高级程序员
私信 提问
Class.forName() 和 ClassLoader.loadClass()的区别?

Class.forName() 和 ClassLoader.loadClass()的区别? Class.forName() 和 Class.forName().NewInstance()的区别? Class.forName("xx.xx")等同于Class.forName("xx.xx",true,CALLClass.class.......

taote
2012/02/19
0
0
Class.forName和classLoader.loadClass的比较

Class.forName和ClassLoader.loadClass的比较 简述: Class.forName(String className)使用装载当前类的类装载器来装载指定类。在class.forName(String className)方法内部调用了Class.for...

最王座
2016/04/01
37
0
JAVA虚拟机加载类的方式解析

虚拟机加载类的途径 1、由 new 关键字创建一个类的实例 在由运行时刻用 new 方法载入 如:Dog dog = new Dog(); 2、调用 Class.forName() 方法 通过反射加载类型,并创建对象实例 如:C...

mfcai
2012/10/22
0
0
ClassLoader.loadclass和Class.forName的区别

今天在看spring源码时,发现里面有很多都是ClassLoader.loadClass(),觉得很奇怪跟我们平时用的不太一样呢? 百度一下发现区别在与static块呢。如果不需要static则用ClassLoader.loadClass()...

jack_peng
09/21
0
0
Java面试基础篇——第十一篇:Class.forName和ClassLoader的区别

Java中的和都可以用来对类进行加载。除了将类的.class文件加载到JVM中 还会对类进行解释,执行类中的static块,而只会将.class文件加载到JVM,不会执行static块,只有在newInstance的时候才执...

developlee的潇洒人生
07/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

揭秘 | 双11逆天记录背后的数据库技术革新

摘要: 第十个天猫“双11”狂欢节圆满落幕,如今双11已不仅仅是天猫的盛会,更是阿里技术人的新年 每一个数字背后 都需要强大的技术支撑 Higher, Faster, Smarter 是我们不变的追求 技术无边...

阿里云云栖社区
21分钟前
4
0
element ui中的input组件不能监听键盘事件解决

vue使用element-ui的el-input监听不了键盘事件,原因应该是element-ui自身封装了一层div在input标签外面,把原来的事件隐藏了,所以如下代码运行是无响应的: <el-input v-model="search" p...

呵呵闯
23分钟前
3
0
Linux常用中间件启动命令

zookeeper redis lts

王桥修道院副院长
24分钟前
1
0
Kotlin极简教程中对? extends 和 ? super (out和int)的描述

PECS 现在问题来了:我们什么时候用extends什么时候用super呢?《Effective Java》给出了答案: PECS: producer-extends, consumer-super 比如,一个简单的Stack API: public class Stack<E...

SuShine
25分钟前
1
0
微信分享link问题

前提:公司业务,分享的页面需要自定义并且是一个固定页面 因此自定义分享link,这里存在一个问题,必须与安全域名一致,自不必说,而且这个link必须是当有协议的,也就是说不能写成locatio...

litCabbage
28分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部