以下代码来自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()
的内容是什么?我已阅读了该文件,无法理解。
感谢。
答案 0 :(得分:0)
回答你的第一个问题,
为什么DriverManager.getCallerClassLoader();
的结果值可能为空?
因为,如果你看到它在班级DriverManager
/* Returns the caller's class loader, or null if none */
private static native ClassLoader getCallerClassLoader();
它的本机方法和null值可以返回。
回答你的第二个问题:
Thread.currentThread().getContextClassLoader()
的内容是什么?
每个帖子都有一个与之关联的类加载器。如果线程是主线程,则与之关联的类加载器为System Class Loader。
很多时候,您通过一个类加载器创建一个对象,并且该对象可能被其他类加载器启动的线程使用。因此getContextClassLoader()
允许您访问类加载器,而不是加载对象的类加载器,并且可以访问Thread的类加载器可用的资源。
Here is another thread在同一个论坛上详细阐述了同一主题。