一、类加载过程

装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象; 
 
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; 
 
  校验:检查导入类或接口的二进制数据的正确性;(文件格式验证,元数据验证,字节码验.           证,符号引用验证) 
 
  准备:给类的静态变量分配并初始化存储空间; 
 
  解析:将常量池中的符号引用转成直接引用; 
 
初始化:激活类的静态变量的初始化Java代码和静态Java代码块,并初始化程序员设置的变量值。

二、两种加载类方式的区别

Java中Class.forName和classloader都可以用来对类进行加载。

Class.forName(“className”);
        其实这种方法调运的是:Class.forName(className, true, ClassLoader.getCallerClassLoader())方法
        参数一:className,需要加载的类的名称。
        参数二:true,是否对class进行初始化(需要initialize)
        参数三:classLoader,对应的类加载器

ClassLoader.laodClass(“className”);
        其实这种方法调运的是:ClassLoader.loadClass(name, false)方法
        参数一:name,需要加载的类的名称
        参数二:false,这个类加载以后是否需要去连接(不需要linking)

可见Class.forName除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。

而classloader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。

三  数据库链接为什么使用Class.forName(className)

JDBC  Driver源码如下,因此使用Class.forName(classname)才能在反射回去类的时候执行static块。

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

Java中Class.forName和 ClassLoader.loadClass()区别相关推荐

  1. 在 Java 的反射中,Class.forName 和 ClassLoader 的区别

    前言 最近在面试过程中有被问到,在Java反射中Class.forName()加载类和使用ClassLoader加载类的区别.当时没有想出来后来自己研究了一下就写下来记录一下. 解释 在java中Cl ...

  2. 反射中Class.forName()和ClassLoader.loadClass()的区别

    一 Java类装载过程 装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象: 链接:执行下面的校验.准备和解析步骤,其 ...

  3. 【重难点】【JVM 02】反射在 JVM 层面的实现流程、Class.forName() 和 ClassLoader.loadClass 的区别

    [重难点][JVM 02]反射在 JVM 层面的实现流程.Tomcat 的请求流程和 JVM 的类加载情况 文章目录 [重难点][JVM 02]反射在 JVM 层面的实现流程.Tomcat 的请求流程 ...

  4. Java中实现接口与继承的区别

    ** Java中实现接口与继承的区别 ** 首先,先来了解一下什么是接口和继承.接口一般是使用interface来定义的.接口定义同类的定义类似,分为接口的声明和接口体,其中接口体由常量定义和方法定义 ...

  5. Java中PreparedStatement和Statement的用法区别

    Java中PreparedStatement和Statement的用法区别 (2012-08-01 11:06:44) 转载▼ 标签: 杂谈   1. PreparedStatement接口继承Sta ...

  6. Java中long和Long有什么区别

    Java中long和Long有什么区别(转) Java的数据类型分两种: 1.基本类型:long,int,byte,float,double,char 2. 对象类型(类): Long,Integer ...

  7. java中的sleep()和wait()的区别

    对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监 ...

  8. Java中活锁和死锁有什么区别?

    Java中活锁和死锁有什么区别? 活锁:一个线程通常会有会响应其他线程的活动.如果其他线程也会响应另一个线程的活动,那么就有可能发生活锁.同死锁一样,发生活锁的线程无法继续执行.然而线程并没有阻塞-- ...

  9. Java中wait和sleep方法的区别

    1.两者的区别 这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁). wait ...

最新文章

  1. excel两个指标相关性分析_Excel实操分析函数,投资决策指标的假设分析,就是那么简单...
  2. 数据库报错1046-No database selected
  3. 【BZOJ2819】Nim 树状数组+LCA
  4. GMQ稳定币为区块链资产在金融市场的进一步应用打开了一扇大门
  5. jzoj3626-[LNOI2014]LCA【树链剖分,线段树】
  6. javaScript的字符串对象
  7. 《设计师要懂心理学》-第九章-人会犯错
  8. 到底应该使用count(*) 还是count(1)
  9. window.print()后针式打印机打印出的内容成虚线问题
  10. html拖拽验证,jQuery按住滑块拖动验证插件
  11. Python爬取文件的11种方式
  12. 单模光纤最大传输距离为多少_单模光纤的最长传输距离是多少?单模光纤和多模光纤的区别在于什么?...
  13. 老板电器携手华为HarmonyOS创新升级中国厨房新理念
  14. GAN性能评测:Inception Score
  15. 【神奇的电报】CSP题目 C++实现
  16. 经常说的ROI是什么,怎么计算
  17. 南梦宫 拼图笔记 1.流畅的拖拽操作
  18. 博贤科技管理系统漏洞0day
  19. 【backtrader源代码解析17】sharpe.py源代码解析(backtrader计算夏普率的方式)
  20. 软件定义广域网和即将到来的网络洪流

热门文章

  1. 由单例模式造成的内存泄漏
  2. 安卓从业者应该关注:Android 6.0的运行时权限
  3. css编写的技巧效果总结
  4. GoLang之方法与接口
  5. AutoRun Pro Enterprise II 教程--- 教你制作软件工具箱教程清晰版(教程画面清晰,教程语音可以调高)...
  6. 【译】将IDataRecord自动填充到实体的扩展方法
  7. 使用date命令来修改系统日期与时间
  8. 部署OCS后修改web farm地址
  9. js下的keyCode.
  10. 同工不同酬,年薪 50 万美金的工程师到底有什么神本事?