DriverManager.getCallerClassLoader()
类中的方法java.sql.DriverManager
声明为 native
. 我了解应用程序中的所有类加载器引用在当前执行的 JVM 中都可用。另外,我对本机方法的基本理解是,它用于调用本机库中定义的方法,并且它们在 JVM 执行环境之外执行。
我的问题是,DriverManager.getCallerClassLoader()
需要它的实现是本机的需要什么?
DriverManager.getCallerClassLoader()
类中的方法java.sql.DriverManager
声明为 native
. 我了解应用程序中的所有类加载器引用在当前执行的 JVM 中都可用。另外,我对本机方法的基本理解是,它用于调用本机库中定义的方法,并且它们在 JVM 执行环境之外执行。
我的问题是,DriverManager.getCallerClassLoader()
需要它的实现是本机的需要什么?
我对本机方法的基本理解是它用于调用本机库中定义的方法
这是正确的,本机方法表示对作为本机编译库的一部分的代码的调用
它们在 JVM 执行环境之外执行
这就是本机方法通常所做的事情。即Java用户编写的本机方法。但是,本机方法的功能并不受限制:一旦您在 JVM 之外,您就可以为所欲为。Class<T>
事实上, Java的内置类(例如native
.
其中一种方法是包私有java.lang.Class<T>.getClassLoader0
(是的,零)。最终的实现ClassLoader.getCallerClassLoader
参考了这个方法,它查询JVM内部来获取类加载器。
请注意,DriverManager
不能将调用转发到ClassLoader.getCallerClassLoader
,因为这将返回DriverManager
的类加载器(因为DriverManager
将是 的调用者getCallerClassLoader
)。也不可能DriverManager
重复ClassLoader
's的“魔力” getCallerClassLoader
,因为它位于不同的包中(即不在 中java.lang
),因此Class<T>.getClasLoader0
无法访问。这就是为什么它被迫移动getCallerClassLoader
到native
领土,本地代码可以获取调用类并无限制地获取其类加载器。