gpt4 book ai didi

java - 为什么 java.sql.DriverManager.getCallerClassLoader() 是 native 的?

转载 作者:行者123 更新时间:2023-11-30 04:36:45 24 4
gpt4 key购买 nike

java.sql.DriverManager 中的方法 DriverManager.getCallerClassLoader() is declared as native 。据我所知,应用程序中的所有类加载器引用都可以在当前执行的 JVM 中使用。另外,我对原生方法的基本理解是,它用于调用原生库中定义的方法,并且它们在JVM执行环境之外执行。

我的问题是,DriverManager.getCallerClassLoader() 需要什么来实现 native 实现?

最佳答案

My basic understanding about native method is that its used to call the method defined in native libraries

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

and they execute outside the JVM execution environment

这就是 native 方法通常所做的事情。即Java用户编写的 native 方法。但是, native 方法的功能不受限制:一旦脱离 JVM,您就可以做您想做的事情。其实Java的内置类比如 Class<T> ,严重依赖这样做的能力,有数十个native方法散布在他们的 Java 代码中。

其中一个方法是包私有(private)的 java.lang.Class<T>.getClassLoader0 (是的,带零)。执行 ClassLoader.getCallerClassLoader 最终引用这个方法,它查询JVM内部来获取类加载器。

请注意DriverManager无法将调用转接至ClassLoader.getCallerClassLoader ,因为这会返回 DriverManager的类加载器(因为 DriverManager 将是 getCallerClassLoader 的调用者)。 DriverManager 是不可能的重复 ClassLoader 的“魔力”的getCallerClassLoader要么,因为它位于不同的包中(即不在 java.lang 中),所以 Class<T>.getClasLoader0不可访问。这就是为什么它被迫移动 getCallerClassLoader进入native领域,本地代码可以不受限制地获取调用类并获取其类加载器。

关于java - 为什么 java.sql.DriverManager.getCallerClassLoader() 是 native 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13310592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com