ネイティブ メソッドに関する私の基本的な理解は、ネイティブ ライブラリで定義されたメソッドを呼び出すために使用されるということです。
これは正しいです。ネイティブ メソッドは、ネイティブ コンパイル ライブラリの一部であるコードの呼び出しを表します。
JVM 実行環境外で実行される
これが、ネイティブ メソッドが通常行うことです。つまり、Java ユーザーが作成するネイティブ メソッドです。ただし、ネイティブ メソッドでできることは限られているわけではありません。JVM の外に出れば、やりたいことを実行できます。実際、 などの Java の組み込みクラスはClass<T>
、その機能に大きく依存しており、native
その Java コードには数十のメソッドが散りばめられています。
これらの方法の 1 つは package-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