ClassLoader は、実行時に Java クラスを動的にロードして、JVM が ClassLoader が Java ランタイム環境の一部であることを認識しないようにするオブジェクトです。これにより、JVM の作業が容易になります。 JVM は、アプリケーションで必要な場合にクラスをメモリにロードし、すべてを一度にロードすることはありません。次に、ClassLoader が登場し、クラスをメモリに読み込みます。
無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
java.lang.ClassLoader が Java ライブラリ コードにどのように実装されるのか、またその機能は何なのかを見てみましょう。
java.lang.ClassLoader:
public abstract class ClassLoader { public class loadClass(String name); protected class defineClass(byte[] b); public URL getResource(String name); public Enumeration getResources(String name); public ClassLoader getParent() };
Java の ClassLoader の機能を見てみましょう:
クラスローダーがどのように機能するかを示す例:
コード:
public class A() { public void addOne() { B b = new B(); b.addTwo(); } }
上記のシナリオで ClassLoader がクラスをロードする方法:
このチュートリアルでは、さまざまな種類のクラス ローダーとその組み込み機能、およびそれが使用される理由について説明します。
拡張クラスローダーはブートストラップの子です。これは、JVM に組み込まれるすべての Java クラスの拡張機能をロードするために使用されます。
すべてのクラスには、それが作成するすべてのクラスへのリンクがあります。事実上、静的フィールドを保存するためのメモリが必要です。 classLoader が単一クラスの静的フィールドをリークした場合、それは単に ClassLoader がリークしていることを意味します。そうすると、すべてのクラス、多数のオブジェクト、およびそれらがリンクしているすべてのオブジェクトが漏洩することになります。 ClassLoader のリークは危険すぎる可能性があります。
アプリケーションの実行時に再デプロイメントを実行したり拡張機能を追加したりするたびに、ClassLoader はクラスをロードしますが、クラスを再ロードまたはアンロードすることはありません。そのため、クラスローダーが単一のクラスを最初からロードする場合、クラスローダーは、それを最初から再作成または再ロードするためにいくつかのオブジェクトを持ちます。古いクラスローダーは、オブジェクトを古い状態から新しい状態に送信します。したがって、この移行中にリークが発生する可能性があります。したがって、オブジェクトをリークしているときはクラスをリークしていることになり、それがクラスローダーです。
There are 3 principles that a java ClassLoader works upon:
This is the custom ClassLoader example named with ClassLoaderJava.java:
Code: ClassLoaderJava.java
import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class ClassLoaderJava extends ClassLoader{ // created to load class and invoke method. public void classLoadingDemo(String classBinString, String methodName) { try { // will create an instance of class loader. ClassLoader classLoaderInstance = this.getClass().getClassLoader(); // creating an instance of a class to store the loaded class. Class loadedClass = classLoaderInstance.loadClass(classBinString); System.out.println("Loaded class name is: " + loadedClass.getName()); // Fetching the constructor of loaded class. Constructor con = loadedClass.getConstructor(); // creating an instance to invoke the method. Object obj = con.newInstance(); // Will store the method fetched from loaded class. Method invokingMethod = loadedClass.getMethod(methodName); System.out.println("Invoked method name is: " + invokingMethod.getName()); invokingMethod.invoke(obj); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
Code: DemoClass.java
public class DemoClass { public void add() { System.out.println("This method is invoked by the classLoader."); } }
Code: LoadingTest.java
public class LoadingTest { public static void main(String[] args) { ClassLoaderJava classLoader = new ClassLoaderJava(); classLoader.classLoadingDemo("DemoClass" , "add"); } }
Output:
以上がJavaのクラスローダーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。