Class.forName

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

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

 

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

 

 

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的区别

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

 

相关文章: