Java 您能解释一下DriverManager.class中与类加载器相关的代码片段吗
以下代码来自Java 您能解释一下DriverManager.class中与类加载器相关的代码片段吗,java,jvm,classloader,Java,Jvm,Classloader,以下代码来自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.getCalle
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()的作用是什么?我看了文件,看不懂
谢谢。要回答您的第一个问题
为什么使用DriverManager.getCallerClassLoader()的结果值代码>可能为空
这是因为,如果您看到它在类DriverManager
/* Returns the caller's class loader, or null if none */
private static native ClassLoader getCallerClassLoader();
它是本机方法,可以返回null值
回答你的第二个问题:
Thread.currentThread().getContextClassLoader()的作用是什么
每个线程都有一个与之关联的类加载器。如果线程是主线程,那么与其关联的类加载器就是系统类加载器
很多时候,一个类加载器创建一个对象,而这个对象可能会被其他类加载器启动的线程使用。因此getContextClassLoader()
允许您访问类加载器,而不是加载对象的类加载器,并且可以访问线程的类加载器可用的资源
在同一论坛上,就同一主题进行了更多的阐述