动态加载类的形式
动态加载类的方式
背景知识:类的初始化前还需要有两个阶段: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());