动态加载类的形式

动态加载类的方式

背景知识:类的初始化前还需要有两个阶段:load和连接。连接又分为验证(),准备(类型 内存),解析(符号引用解析成直接引用)三个阶段。

 

动态加载类有java.lang.Class.forName() 和 自定义ClassLoader的loadClass()两种方式。区别是loadClass方式并不能保证类被初始化了(有个带resolve参数的接口已经被废弃了)。而forName方式有个参数initialize=true参数可以保证该类被连接,初始化了。

 

接口如下:

public static Class forName(String className, boolean initialize, ClassLoader loader) throws ClassNotFound Exception;

 

protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException;

 

 

例如JDBC连接时用forName的方式,initialize=true,这样保证了jdbc驱动的静态初始化代码得到运行。从而使驱动程序注册到DriverManager。而不仅仅是被加载。

 

一个mysql驱动加载的例子是:

    Class.forName("com.mysql.jdbc.Driver");  

等价于:

     Class.forName("com.mysql.jdbc.Driver", true,  this.getClass().getClassLoader());