0

以下代码来自java.sql.DriverManager

public static Connection getConnection(String url,String user, String password)    {
    // Gets the classloader of the code that called this method, may 
    // be null.
    ClassLoader callerCL = DriverManager.getCallerClassLoader();
    return (getConnection(url, info, callerCL));
 }

我的第一个问题是为什么结果值DriverManager.getCallerClassLoader();可能为空?我认为调用者类应该是用户自己的类,通常是AppClassLoader

上述代码的子序列,getConnection(url, info, callerCL)方法体包含以下代码片段。

if(callerCL == null) {
    callerCL = Thread.currentThread().getContextClassLoader();
}    

有什么Thread.currentThread().getContextClassLoader()用?我浏览了文档,无法理解。

谢谢。

4

1 回答 1

0

要回答你的第一个问题,

为什么结果值DriverManager.getCallerClassLoader();可能为空?

这是因为,如果您看到它在类中定义的方式DriverManager

/* Returns the caller's class loader, or null if none */
    private static native ClassLoader getCallerClassLoader();

它是本机方法,并且可以返回空值。

回答你的第二个问题:

有什么Thread.currentThread().getContextClassLoader()用?

每个线程都有一个与之关联的类加载器。如果线程是主线程,则与之关联的类加载器是系统类加载器。

很多时候,您通过一个类加载器创建一个对象,并且该对象可能被其他一些类加载器启动的线程使用。因此getContextClassLoader(),您可以访问一个类加载器,该类加载器不是加载对象的类加载器,并且可以访问线程的类加载器可用的资源。

这是同一论坛上的另一个主题,详细说明了同一主题。

于 2012-11-09T13:11:01.430 回答