Javaのクラスローダー

王林
王林オリジナル
2024-08-30 16:04:051024ブラウズ

ClassLoader は、実行時に Java クラスを動的にロードして、JVM が ClassLoader が Java ランタイム環境の一部であることを認識しないようにするオブジェクトです。これにより、JVM の作業が容易になります。 JVM は、アプリケーションで必要な場合にクラスをメモリにロードし、すべてを一度にロードすることはありません。次に、ClassLoader が登場し、クラスをメモリに読み込みます。

無料ソフトウェア開発コースを始めましょう

Web 開発、プログラミング言語、ソフトウェア テスト、その他

Java で ClassLoader を実装するには?

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 の機能を見てみましょう:

  • loadClass(): これは、クラスの名前を文字列として受け取り、クラスのインスタンスを返す重要なメソッドです。これがクラスローダーのクラスになります。がクラスパス上で見つかり、そこからオブジェクトをインスタンス化できるようにそれを提供します。
  • defineClass(): このメソッドは、引数としてバイト配列を受け取り、そのバイト配列からクラスを作成することを除いて、loadClass メソッドと同様に機能します。つまり、クラス自体を受け取ります。バイト配列として。これは、クラス自体がバイト配列として与えられるのに対し、loadClass メソッドはロードするためにそのクラスを見つける必要があるため、loadClass メソッドとは少し異なります。
  • getResource() または getResources(): このメソッドは、文字列名とパッケージ名。すべての仮定を無視して、クラスがどこからどのようにロードされているかの正確なパスが表示されます。
  • getparent(): これは、classLoader の階層を理解するための重要なメソッドです。 ClassLoader はフラットな構造ではなく、親と子の階層とレベルとレベルの構造があります。

ClassLoader は Java でどのように機能しますか?

クラスローダーがどのように機能するかを示す例:

コード:

public class A() {
public void addOne() {
B b = new B();
b.addTwo();
}
}

上記のシナリオで ClassLoader がクラスをロードする方法:

  • ご覧のとおり、上記のコードでは、クラス A が関数 addOne() を呼び出します。そして、その関数内でクラス B のインスタンスが作成され、クラス B から別のメソッド addTwo() が呼び出されます。
  • クラスローダーはクラス A をロードし、次にクラスローダーはクラス B をロードします。したがって、呼び出しは class.getClassLoader().loadClass(“B”);
  • のように行われます。
  • クラスローダーのこの機能により、クラスの階層を持ち、それらの接続をデコードできます。

クラスローダーの種類

このチュートリアルでは、さまざまな種類のクラス ローダーとその組み込み機能、およびそれが使用される理由について説明します。

1.ブートストラップ クラスローダー

  • Java ClassLoader は java.lang のインスタンスでもあります。 ClassLoader はクラスですが、誰が ClassLoader クラスをロードするのか想像してみてください。 Bootstrap ClassLoader が登場するシナリオを見ていきます。
  • すべての rt.jar およびその他のコア ライブラリが $JAVA_HOME/jre/lib ディレクトリからロードされます。
  • 他のすべての ClassLoader インスタンスの親として機能します。
  • これは JVM パーツの 1 つであり、ネイティブ コードで書かれています。したがって、この特定の ClassLoader の実装は変更される可能性があります。

2.拡張クラスローダー

拡張クラスローダーはブートストラップの子です。これは、JVM に組み込まれるすべての Java クラスの拡張機能をロードするために使用されます。

3.アプリケーションクラスローダー

  • これは Extension ClassLoader の子です。
  • これは、クラスパス環境変数 –classpath または –cp 内のすべてのアプリケーションレベルのクラスをロードするために使用されます。

クラスローダーのリーク

すべてのクラスには、それが作成するすべてのクラスへのリンクがあります。事実上、静的フィールドを保存するためのメモリが必要です。 classLoader が単一クラスの静的フィールドをリークした場合、それは単に ClassLoader がリークしていることを意味します。そうすると、すべてのクラス、多数のオブジェクト、およびそれらがリンクしているすべてのオブジェクトが漏洩することになります。 ClassLoader のリークは危険すぎる可能性があります。

アプリケーションの実行時に再デプロイメントを実行したり拡張機能を追加したりするたびに、ClassLoader はクラスをロードしますが、クラスを再ロードまたはアンロードすることはありません。そのため、クラスローダーが単一のクラスを最初からロードする場合、クラスローダーは、それを最初から再作成または再ロードするためにいくつかのオブジェクトを持ちます。古いクラスローダーは、オブジェクトを古い状態から新しい状態に送信します。したがって、この移行中にリークが発生する可能性があります。したがって、オブジェクトをリークしているときはクラスをリークしていることになり、それがクラスローダーです。

Principles of Java ClassLoader

There are 3 principles that a java ClassLoader works upon:

  • Delegation Model: It delegates class loading requests to parent ClassLoader and loads class only if the parent is not able to find or load the class.
  • Visibility Principle: This principle states the visibility scope of loaded classes. Class loaded by its parent is visible to parent class loaders, but the class loaded by its child is not visible to the parent class loader.
  • Uniqueness Property: It ensures that there is no repetition of classes in the class loader. If a parent loads a class, then its corresponding child does not load this class.

Example of Custom ClassLoader

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のクラスローダー

以上がJavaのクラスローダーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。