IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Mysql的ClassforName初探 -> 正文阅读

[大数据]Mysql的ClassforName初探

背景

在使用开源爬虫的时候,发现需要配置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
     */
    @CallerSensitive
    public 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()改成手工操作。为啥要手工操作,如果你有多个不同的数据源,你又没有配置进去。要想做成多租户的方式,用这个方式让客户自己去配置自己的业务库,这个就方便多了。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-02 13:28:01  更:2022-05-02 13:28:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:16:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码