Class.forName


除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。(默认true,可以手动控制)


JAVA系列:Class.forName和classloader的区别_mysql 


JAVA系列:Class.forName和classloader的区别_mysql_02



classloader


只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。



最后还有必要在此提一下new方法和newInstance方法的区别

newInstance: 弱类型。低效率。只能调用无参构造。

new: 强类型。相对高效。能调用任何public构造。



Demo

例如,在JDBC编程中,常看到这样的用法,Class.forName("com.mysql.jdbc.Driver"),如果换成了 getClass().getClassLoader().loadClass("com.mysql.jdbc.Driver"),就不行。 

为什么呢?打开​com.mysql.jdbc.Driver的源代码​看看, 

JAVA系列:Class.forName和classloader的区别_加载_03

Driver在static块中会注册自己到java.sql.DriverManager。而static块就是在Class的初始化中被执行。所以这个地方就只能用Class.forName(className)。