在 Java 的反射中,Class.forName 和 ClassLoader 的区别

在 Java 的反射中,Class.forName 和 ClassLoader 的区别

前言
最近在网上看到有问,在Java反射中Class.forName()加载类和使用ClassLoader加载类的区别。当时没有想出来后来自己研究了一下就写下来记录一下。

解释
在java中Class.forName()和ClassLoader都可以对类进行加载。ClassLoader就是遵循双亲委派模型最终调用启动类加载器的类加载器,实现的功能是“通过一个类的全限定名来获取描述此类的二进制字节流”,获取到二进制流后放到JVM中。Class.forName()方法实际上也是调用的CLassLoader来实现的。

Class.forName(String className);这个方法的源码是

@CallerSensitive
public static Class

###分割符(上面是Class.forName的加载过程,下面是ClassLoader的加载过程)

根据运行结果得出Class.forName加载类是将类进了初始化,而ClassLoader的loadClass并没有对类进行初始化,只是把类加载到了虚拟机中。

应用场景
在我们熟悉的Spring框架中的IOC的实现就是使用的ClassLoader。

而在我们使用JDBC时通常是使用Class.forName()方法来加载数据库连接驱动。这是因为在JDBC规范中明确要求Driver(数据库驱动)类必须向DriverManager注册自己。

以MySQL的驱动为例解释:

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
// ~ Static fields/initializers
// ———————————————

//  
// Register ourselves with the DriverManager  
//  
static {  
    try {  
        java.sql.DriverManager.registerDriver(new Driver());  
    } catch (SQLException E) {  
        throw new RuntimeException("Can't register driver!");  
    }  
}  

// ~ Constructors  
// -----------------------------------------------------------  

/** 
 * Construct a new driver and register it with DriverManager 
 *  
 * @throws SQLException 
 *             if a database error occurs. 
 */ 
public Driver() throws SQLException {  
    // Required for Class.forName().newInstance()  
}  

}
我们看到Driver注册到DriverManager中的操作写在了静态代码块中,这就是为什么在写JDBC时使用Class.forName()的原因了。

希望好好学习天天向上,大聪IT加油!

猜你喜欢

转载自blog.csdn.net/qq_42800135/article/details/81667310
今日推荐