背景

在使用开源爬虫的时候,发现需要配置mysql的DriverClassName。因为这个是固定的,所以一般没怎么看。然后随便复制一个放里面了。发现居然报错了。

好奇心的驱使下,我把开源代码拉下来,然后跟踪了下代码。

发现代码中这行使用了Class.forName()。

于是...

源码

这个是源码,翻译的不好别怪我。我英语超烂的。

    /*** 返回与具有给定字符串名的类或接口关联的Class对象。调用此方法相当于:** <blockquote>*    Class.forName(className, true, currentLoader)* </blockquote>** 这里 currentLoader 表示定义一个当前类的类加载器.** <p> 例如,下面的代码片段 返回命名为java.lang.Thread类的运行时的描述* :** <blockquote>*   {@code Class t = Class.forName("java.lang.Thread")}* </blockquote>* <p>* A call to {@code forName("X")} causes the class named* {@code X} to be initialized.** @param      className   the fully qualified name of the desired class.* @return     the {@code Class} object for the class with the*             specified name.* @exception LinkageError if the linkage fails* @exception ExceptionInInitializerError if the initialization provoked*            by this method fails* @exception ClassNotFoundException if the class cannot be located*/@CallerSensitivepublic static Class<?> forName(String className)throws ClassNotFoundException {Class<?> caller = Reflection.getCallerClass();return forName0(className, true, ClassLoader.getClassLoader(caller), caller);}

简单来讲,就是在知道类名的情况下,获取当前类。

其实在这之前,我们还是需要知道下java的运行机制。

JVM运行机制

来个简单的图看下

 图说明:

编译阶段

java源代码,编译转换成class字节码。

这是为什么呢?为了实现JAVA伟大的梦想!

I hava dream :"编译一次,到处运行"

这个也就是我们说的跨平台。

也就是你把编译好的jar包,放哪里运行都是一样的(去除外部环境例如JVM的版本等)

如果感兴趣,你可以把jar包解压,发现里面除了配置文件外,所有的源码都变成了class了。

运行阶段

这个阶段就在JVM上分阶段了。

在此之前,先说个Java的特性:动态加载

动态加载的粗浅意思就是,不全部加载,先加载部分,然后在有需要的时候,按需加载。

也就是所有的类都是在对其第一次使用的时候被加载到JVM中。如当程序创建对第一个静态成员的引用时,就会加载这个类。或者使用new关键字创建新的对象的时候。

这里留个小问题:为什么要动态加载?

我们看到运行时的第一步就是:类加载器。

既然是动态加载,那么怎么实现动态加载呢?

默认的类加载器就会根据类名查找.class文件

Class.forName的重头戏上来了。

根据类名查找,forName这个意思就是根据类名哈。

所以,呵呵这个就简单了

相当于把当前类加载到JVM中,且初始化。

JVM内存模型

JVM内存模型太麻烦了,这里就不讲了,而且不同的JVM机中间还有点差异。感兴趣的自己去研究下。

总结

所以简单点来讲,就是动态的加载这个类。把原来机器调用的时候,用Class.forName()改成手工操作。为啥要手工操作,如果你有多个不同的数据源,你又没有配置进去。要想做成多租户的方式,用这个方式让客户自己去配置自己的业务库,这个就方便多了。

Mysql的ClassforName初探相关推荐

  1. MySQL - 锁机制初探

    文章目录 生猛干货 Pre 锁的分类 InnoDB 中的锁 行锁 InnoDB 行锁的三种算法实现 Record Lock 锁 Gap Lock 锁 Next-key Lock 锁 表锁 表锁的分类 ...

  2. MySQL - 存储引擎初探

    文章目录 生猛干货 存储引擎概述 实例层 物理层 内存和物理结构 Buffer Pool Redo log 5.7新版本特性 8.0 新版本特性 InnoDB VS MyISAM 功能对比 事务支持 ...

  3. mysql Partition(分区)初探

    表数据量大的时候一般都考虑水平拆分,即所谓的sharding.不过mysql本身具有分区功能,可以实现一定程度 的水平切分. mysql是具有MERGE这种引擎的,就是把一些结构相同的MyIASM表作 ...

  4. gearman mysql编译_gearman初探(一、编译和安装)

    gearman是一个任务分发系统,将计算比较耗时的任务分发给不同的机器专门进行计算,而任务发起的初始程序不必等待这些任务完成就可以返回而继 续执行.笔者最开始做PHP邮件发送的时候,因为邮件发送耗时比 ...

  5. mysql in partition_MySQL Partition分区扫盲

    MySQL从5.1.3开始支持Partition,你可以使用如下命令来确认你的版本是否支持Partition: mysql> SHOW VARIABLES LIKE '%partition%'; ...

  6. mysql5.7 json特性_【Mysql】Mysql5.7新特性之-json存储

    一 写在前面 本系列文章基于 5.7.12 版本讲述MySQL的新特性.从安装,文件结构,SQL ,优化 ,运维层面 复制,GITD等几个方面展开介绍 5.7 的新特性和功能.同时也建议大家跟踪官方b ...

  7. MySQL最全整理(面试题+笔记+导图),面试大厂不再被MySql难倒

    前言 作为一名编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的.对于求职者来说,MySQL又是面试中一定会问到的重点,很多人拥有大厂梦,却因为MySQL败下阵来.实际 ...

  8. MySQL最全整理(面试题+笔记+导图),面试大厂不再被MySql难倒!

    前言 作为一名编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的.对于求职者来说,MySQL又是面试中一定会问到的重点,很多人拥有大厂梦,却因为MySQL败下阵来.实际 ...

  9. MySQL问题让你大厂梦碎?那这本书籍你不妨看看

    前言 作为一名编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的.对于求职者来说,MySQL又是面试中一定会问到的重点,很多人拥有大厂梦,却因为MySQL败下阵来.实际 ...

  10. mysql建表 外键_mysql建表外键怎么设

    mysql建表外键怎么设 mysql建表时设置外键的方法:在"CREATE TABLE"语句中,通过"[CONSTRAINT ] FOREIGN KEY 字段名 [,字段 ...

最新文章

  1. 无人驾驶之车道线检测简易版
  2. 《作业控制系列》-“linux命令五分钟系列”之十
  3. 测试Hibernate的最低配置
  4. [导入]VB PE导出/输入表演示(读文件版)
  5. c# 日期函数[string.Format----GetDateTimeFormats] --转载
  6. GCD应用及其他方法
  7. php var export 数组,PHP关于数组缓存JSON、serialize、var_export的说明
  8. 这可能是最好的RxJava 2.x 入门教程学习系列
  9. mysql 1607_Windows下Mysql启动“服务名无效”及“系统错误1607”解决办法
  10. Shell脚本之awk篇
  11. 使用jpeglib直接把NV12转为jpeg文件的代码
  12. wps纸张大小设置成A4_pdf两页合并一页a4,只需这招轻松搞定
  13. 浏览器怎么截图,这个快捷键截图也太好用了吧
  14. 利用python在excel中画图
  15. 不支持:http://javax.xml.XMLConstants/property/accessExternalStylesheet
  16. python怎么爬虎牙_【python】虎牙直播爬虫项目
  17. 工作表、工作簿保护密码关闭
  18. 使用WEX5移动开发工具制作仿淘宝APP
  19. rono在oracle的作用_Ronopterin (VAS203) 在中重度创伤性脑损伤患者中的疗效 (NOSTRA III 期试验): 一项验证性、安慰剂对照、随机、双盲、多中心研究。...
  20. 《计算机学报》征稿简则

热门文章

  1. 通过naa在esxi主机上找到物理磁盘的位置
  2. surface pro4应用软件安装
  3. SCARA——OpenGL入门学习五六(三维变换、动画)
  4. Chunk Extend/Overlapping | 堆拓展、重叠
  5. linux判断三个数大小程序,几个shell程序设计小知识(shell常识部分)
  6. kubesphere K8S Kubeedge 安装配置菜鸟级指导
  7. 数字媒体技术 计算机类 专业大学排名,2019年全国数字媒体技术专业大学排名(20强)...
  8. INDEX REBUILD和INDEX REORGANIZE和UPDATE STATISTICS是否涉及Sch-M的案例分析
  9. pyecharts之参透神剧人物关系
  10. ESP32/ESP32S2直连腾讯云,实现微信小程序控制