1

DriverManager.getCallerClassLoader()クラスのメソッドjava.sql.DriverManager は として宣言されてい nativeます。アプリケーション内のすべてのクラスローダー参照が、現在実行中の JVM で利用できることを理解しています。また、ネイティブ メソッドに関する私の基本的な理解は、ネイティブ ライブラリで定義されたメソッドを呼び出すために使用され、JVM 実行環境の外で実行されるということです。

私の質問は、DriverManager.getCallerClassLoader()その実装をネイティブにする必要があるのは何ですか?

4

1 に答える 1

2

ネイティブ メソッドに関する私の基本的な理解は、ネイティブ ライブラリで定義されたメソッドを呼び出すために使用されるということです。

これは正しいです。ネイティブ メソッドは、ネイティブ コンパイル ライブラリの一部であるコードの呼び出しを表します。

JVM 実行環境外で実行される

これが、ネイティブ メソッドが通常行うことです。つまり、Java ユーザーが作成するネイティブ メソッドです。ただし、ネイティブ メソッドでできることは限られているわけではありません。JVM の外に出れば、やりたいことを実行できます。実際、 などの Java の組み込みクラスはClass<T>、その機能に大きく依存しており、nativeその Java コードには数十のメソッドが散りばめられています。

これらの方法の 1 つは package-private ですjava.lang.Class<T>.getClassLoader0(はい、ゼロ付き)。の実装は、ClassLoader.getCallerClassLoader最終的にこのメソッドを参照し、JVM の内部を照会してクラス ローダーをフェッチします。

はのクラス ローダーを返すため、DriverManagerへの呼び出しを転送できないことに注意してください(が の呼び出し元になるため)。が の「魔法」を繰り返すことはできません。なぜなら、それは別のパッケージにある (つまり、 にない) ため、アクセスできないからです。そのため、ネイティブ コードが呼び出し元のクラスを取得し、そのクラス ローダーを無制限に取得できる領域にを移動する必要があります。ClassLoader.getCallerClassLoaderDriverManagerDriverManagergetCallerClassLoaderDriverManagerClassLoadergetCallerClassLoaderjava.langClass<T>.getClasLoader0getCallerClassLoadernative

于 2012-11-09T15:48:58.767 に答える