Java でクラスをロードするために ClassLoader 関数を使用する原理と方法は、常に Java 開発者の焦点の 1 つです。 ClassLoader 関数は Java クラス ライブラリの一部であり、その主な機能は、プログラムが正常に実行できるように Java クラス ファイルを Java 仮想マシン (JVM) にロードすることです。 ClassLoader 関数は Java クラス ロードの中核です。Java ランタイム環境では、Java クラスのバイトコードを検索してロードします。したがって、Java プログラマが ClassLoader 関数の使用法と原則を理解し、習得することが重要です。 。 の。
Java の ClassLoader 関数は、Bootstrap ClassLoader、Extention ClassLoader、Application ClassLoader の 3 つのレベルに分かれています。 Bootstrap ClassLoader は JVM の内部実装であり、Java コア API ライブラリのクラスを JVM にロードします。 Extention ClassLoader レイヤーは、Java SDK によって提供される拡張 API によって実装されます。アプリケーション クラスローダーは、アプリケーション自体によって実装されるクラスローダーであり、アプリケーション コードをロードするために使用されます。
Java プログラムでは、ClassLoader は階層構造で構成されており、その親子関係は java.lang.ClassLoader クラスによって確立されます。このクラスで定義されている主なメソッドは findClass(String) と loadClass(String) で、これらを通じてクラスをロードできます。
Java では、ClassLoader は、findClass(文字列名) とloadClass(文字列名) の 2 つのメソッドを継承してクラス ローディングを実装するクラスです。プログラムがクラスを呼び出すと、ClassLoader はまず JVM を検索して、クラスがロードされているかどうかを確認します。ロードされている場合は、クラスを直接返します。ロードされていない場合、ClassLoader はクラス ファイルの検索を開始します。 ClassLoader の検索メソッドは、findClass メソッドを呼び出すことによって実装されます。findClass は、最初に java.lang.ClassLoader クラスの検索メソッドを呼び出します。デフォルトでは、デフォルトの ClassLoader はクラス ファイルを見つけることができないため、findClass メソッドは NullPointerException を返します。クラス自体をロードするメソッドを使用する場合は、ClassLoader の findClass メソッドをオーバーライドし、独自のロード ロジックを実装する必要があります。
以下では、クラスローディングの例を通して、ClassLoader 関数の使い方を詳しく紹介します。
例は次のとおりです。
システムの ClassLoader では実現できない機能を実現するために、ClassLoader クラスをカスタマイズします。
カスタム ClassLoader クラスのコードは次のとおりです。
public class MyClassLoader extends ClassLoader { private String classPath; public MyClassLoader(String classPath) { this.classPath = classPath; } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { byte[] classData = getData(name); if (classData == null) { throw new ClassNotFoundException(); } else { return defineClass(name, classData, 0, classData.length); } } private byte[] getData(String className) { String path = classPath + File.separatorChar + className.replace('.', File.separatorChar) + ".class"; try (InputStream is = new FileInputStream(path); ByteArrayOutputStream baos = new ByteArrayOutputStream()) { int bufferSize = 1024; byte[] buffer = new byte[bufferSize]; int length = -1; while ((length = is.read(buffer)) != -1) { baos.write(buffer, 0, length); } return baos.toByteArray(); } catch (IOException e) { e.printStackTrace(); } return null; } }
コードでは、ClassLoader クラスを継承し、findClass メソッドを上書きし、クラスの検索と読み込みを自分で実現します。 getData メソッドは、クラス ファイル内のバイナリ データを読み取るために使用されるプライベート メソッドです。ここでは、Java IO の FileInputStream クラスと ByteArrayOutputStream クラスを使用して、読み取ったファイル形式のデータをバイト配列に変換します。
カスタム ClassLoader クラスを使用するコードは次のとおりです。
public class Test { public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException { MyClassLoader loader = new MyClassLoader("D:\class"); Class c = loader.loadClass("com.test.Test"); Object obj = c.newInstance(); System.out.println(obj); } }
この例では、指定されたパスからカスタム ClassLoader クラスを介して com.test.Test クラスをロードします。クラスインスタンスを作成して出力します。
要約すると、ClassLoader 関数を使用して Java でクラスをロードする手順は、主に 3 つの手順に分かれています。ClassLoader クラスのカスタマイズ、findClass メソッドのオーバーライド、カスタム ClassLoader クラスを使用したクラス ロードの実装です。 Java のクラス ロード メカニズムは非常に重要なメカニズムであるため、Java プログラマが ClassLoader 関数の使用法と原則を習得し、深く理解することが重要です。
以上がJava でクラスをロードするために ClassLoader 関数を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。