Mysql的ClassforName初探
Posted 沛沛老爹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()改成手工操作。为啥要手工操作,如果你有多个不同的数据源,你又没有配置进去。要想做成多租户的方式,用这个方式让客户自己去配置自己的业务库,这个就方便多了。
以上是关于Mysql的ClassforName初探的主要内容,如果未能解决你的问题,请参考以下文章