1

DriverManager.getCallerClassLoader()类中的方法java.sql.DriverManager 声明为 native. 我了解应用程序中的所有类加载器引用在当前执行的 JVM 中都可用。另外,我对本机方法的基本理解是,它用于调用本机库中定义的方法,并且它们在 JVM 执行环境之外执行。

我的问题是,DriverManager.getCallerClassLoader()需要它的实现是本机的需要什么?

4

1 回答 1

2

我对本机方法的基本理解是它用于调用本机库中定义的方法

这是正确的,本机方法表示对作为本机编译库的一部分的代码的调用

它们在 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无法访问。这就是为什么它被迫移动getCallerClassLoadernative领土,本地代码可以获取调用类并无限制地获取其类加载器。

于 2012-11-09T15:48:58.767 回答