ClassLoader.loadClass 和Class.for

2017-04-19  本文已影响0人  walker_liu_fei

前言

在讨论之前,首先要明白一个Java类加载到JVM中经过的三个步骤

两者的区别

对于Class.forName方法来说

   public static Class<?> forName(String name, boolean initialize,
                                   ClassLoader loader)

三个参数的含义分别是

对于 ClassLoader.loadClass()

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException

这个方法的两个参数

所以: 通过传入的参数可以知道,Class.forName 执行之后已经对 被加载类的静态变量分配完毕了存储空间,而classLoader.loadClass 并没有一定执行完 链接这一步.

使用的区别

当你想动态加载一个类,而这个类又存在静态代码块或者静态变量,而你在加载的时候就想同时初始化这些静态代码块。这个时候你可能更应该偏向于使用Class.forName

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    //
    // Register ourselves with the DriverManager
    //
    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }
........................省略代码....................

可以看一个使用,这是一个用户在吗,命令行调用jdbc时的启动入口

    public static void main(String[] args) throws Exception {
        String jdbcUrl = DEFAULT_URL;

        if ((args.length == 1) && (args[0] != null)) {
            jdbcUrl = args[0];
        }
      //可以看到这里是使用了Class.forName 方法而不是 Classloader.forName()
        Class.forName("com.mysql.jdbc.Driver").newInstance();
`.....

一些小的细节

上一篇 下一篇

猜你喜欢

热点阅读