Javaで作業している間、私たちはしばしば多数のクラスを使用します。これらのJavaクラスは、メモリに一度にロードされるのではなく、アプリケーションで必要なときにロードされます。ここで、JavaClassLoaderが登場します。そのため、この記事では、JavaでClassLoaderを使用する方法と例について説明します。
この記事では、次のトピックについて説明します。
始めましょう!
JavaのClassLoaderとは何ですか?
JavaのClassLoaderは、Javaランタイム環境によって呼び出され、アプリケーションで必要なときにクラスを動的にロードします。 Java仮想マシン 。 ClassLoaderはJavaランタイム環境の一部であるため、Java仮想マシンは基盤となるファイルおよびファイルシステムについて何も認識しません。
ここで、Javaのさまざまなタイプの組み込みClassLoaderについて理解しましょう。
最終的に最終的にJavaで終了します
JavaのClassLoaderのタイプ
JavaのさまざまなタイプのClassLoaderは次のとおりです。
それらのそれぞれについて一つずつ議論しましょう。
拡張クラスローダー
名前が示すように、Extension ClassLoaderは、コアJavaクラスの拡張機能を JDK 拡張ライブラリ。これはBootstrapClassLoaderの子であり、JRE / lib / textディレクトリまたはjava.ext.dirsシステムプロパティで指定されたその他のディレクトリから拡張機能をロードします。
アプリケーションまたはシステムClassLoader
アプリケーションまたはシステムClassLoaderは、ExtensionClassLoaderの子です。このタイプのClassLoaderは、-cpコマンドラインオプションまたはintCLASSPATH環境変数にあるすべてのアプリケーションレベルクラスをロードします。
ブートストラップClassLoader
私たち全員が知っているように Javaクラス のインスタンスによってロードされます java.lang.ClassLoade。ただし、ClassLoaderはクラスであるため、BootstrapClassLoaderはJDK内部クラスをロードする責任があります。 BootStrap ClassLoaderは、JVMが操作を呼び出したときに操作を開始し、rt.jarからクラスをロードするマシンコードです。したがって、ブートストラップClassLoaderが提供するのは、親ClassLoaderがないため、PrimordialClassLoaderとして知られていることを理解できます。
注意: Bootstrapの優先度はExtensionよりも高く、ExtensionClassLoaderに与えられる優先度はApplicationClassLoaderよりも高くなります。以下の画像を参照してください。
次のこの記事では、ClassLoaderが機能する原理を理解しましょう。
JavaでのClassLoaderの原則
Java ClassLoaderが機能するための一連のルールは、次の3つの原則です。
それぞれを理解しましょう。
一意性プロパティ
このプロパティにより、クラスの繰り返しがなく、すべてのクラスが一意になります。一意性プロパティは、クラスが親ClassLoaderによってロードされ、子ClassLoaderによってロードされないようにします。親ClassLoaderがクラスを見つけることができないシナリオでは、現在のインスタンスがそれを単独で実行しようとします。
委任モデル
JavaのClassLoaderは、委任モデルによって指定された一連の操作に基づいて機能します。したがって、クラスまたはリソースを検索する要求が生成されるたびに、ClassLoaderインスタンスはクラスまたはリソースの検索を親のClassLoaderに委任します。
ClassLoaderが機能するための一連の操作は次のとおりです。
- Java仮想マシンは、クラスに遭遇するたびに、クラスがロードされているかどうかをチェックします。
- クラスがロードされている場合 JVM クラスの実行を続行しますが、クラスがロードされていないシナリオでは、JVMは、JavaClassLoaderサブシステムにその特定のクラスをロードするように要求します。その後、ClassLoaderサブシステムがアプリケーションClassLoaderに制御を与えます。
- 次に、アプリケーションClassLoaderは要求をExtension ClassLoaderに委任し、その後、ExtensionClassLoaderは要求をBootstrapClassLoaderに渡します。
- これで、BootstrapClassLoaderはクラスパスをブートストラップして、クラスが使用可能かどうかを確認します。クラスが使用可能な場合はロードされ、使用できない場合はリクエストが再び拡張クラスローダーに渡されます。
- 拡張ClassLoaderは、拡張クラスパス内のクラスをチェックします。クラスが使用可能な場合はロードされ、使用できない場合はリクエストが再びアプリケーションクラスローダーに渡されます。
- 最後に、アプリケーションClassLoaderは、アプリケーションクラスパスでクラスを検索します。クラスが使用可能な場合はロードされ、そうでない場合はClassNotFoundExceptionの例外が表示されます。
下の画像を参照してください。
可視性の原則
この原則によれば、子のクラスは、親のClassLoaderによってロードされたクラスに表示されますが、その逆は当てはまりません。したがって、Application ClassLoaderによってロードされたクラスは、ExtensionおよびBootstrapClassLoaderによってロードされたクラスを可視化します。
たとえば、AとBの2つのクラスがある場合、クラスAはApplication ClassLoaderによってロードされ、クラスBはExtensionsClassLoaderによってロードされると想定します。ここで、クラスAとBは、Application ClassLoaderによってロードされたすべてのクラスに表示されますが、クラスBは、ExtensionClassLoaderによってロードされたクラスにのみ表示されます。
また、Bootstrap ClassLoaderを使用してこれらのクラスをロードしようとすると、 java.lang.ClassNotFoundException 。例外。
さて、ClassLoaderのタイプとその背後にある原則がわかったので、いくつかの重要なメソッドを調べてみましょう。から java.lang.ClassLoader クラス。
JavaでのClassLoaderのメソッド
重要なものはほとんどありません ClassLoaderの内容は次のとおりです。
- loadClass(文字列名、ブール値解決)
- defineClass()
- findClass(文字列名)
- Class.forName(文字列名、ブール初期化、ClassLoaderローダー)
- getParent()
- getResource()
loadClass(文字列名、ブール値解決)
このメソッドはClassLoaderのエントリポイントであり、JVMによって参照されるクラスをロードするために使用されます。それはの名前を取ります パラメータとして。 JVMは、loadClass()メソッドを呼び出して、ブール値をtrueに設定することによってクラス参照を解決します。クラスが存在するかどうかを判断する必要がある場合にのみ、ブールパラメータがfalseに設定されます。
ISO9000対シックスシグマ
宣言:
public Class loadClass(String name、boolean resolve)throws ClassNotFoundException {
defineClass()
バイトの配列をクラスのインスタンスとして定義するために使用される最後のメソッド。クラスが無効な場合、ClassFormatErrorがスローされます。
宣言:
保護された最終クラスdefineClass(String name、byte [] b、int off、int len)はClassFormatErrorをスローします
findClass(文字列名)
findClassメソッドは、指定されたクラスを検索するために使用されます。したがって、パラメーターとして完全修飾名を持つクラスを見つけるだけで、クラスをロードしません。親ClassLoaderが要求されたクラスを見つけられない場合、loadClass()メソッドはこのメソッドを呼び出します。また、ClassLoaderの親がクラスを見つけられない場合、デフォルトの実装は ClassNotFoundException。
宣言:
保護されたクラスfindClass(String name)はClassNotFoundExceptionをスローします
Class.forName(文字列名、ブール初期化、ClassLoaderローダー)
このメソッドは、クラスをロードして初期化するために使用されます。 ClassLoaderのいずれかを選択するオプションがあり、ClassLoaderパラメーターがNULLの場合は、自動的にBootstrapClassLoaderが使用されます。。
宣言:
public static Class forName(String name、boolean initialize、ClassLoader loader)throws ClassNotFoundException
getParent()
getParentメソッドは、委任のために親ClassLoaderを返すために使用されます。
宣言:
public final ClassLoader getParent()
getResource()
名前が示すように、getResource()メソッドは指定された名前のリソースを見つけようとしました。最初に、リソースの親ClassLoaderにリクエストを委任します。親がnullの場合、JVMに組み込まれているClassLoaderのパスが検索されます。これが失敗した場合、メソッドはfindResource(String)を呼び出してリソースを検索します。ここで、リソース名は、絶対クラスパスまたは相対クラスパスのいずれかである入力として指定されます。次に、リソースを読み取るためのURLオブジェクトを返すか、リソースにリソースを返すための適切な権限がないか、見つからない場合はnull値を返します。
宣言:
パブリックURLgetResource(String name)
次に、JavaのClassLoaderに関するこの記事では、カスタムClassLoaderについて理解しましょう。
JavaのカスタムClassLoader
組み込みのClassLoaderは、ファイルがすでにファイルシステムにある場合のほとんどを処理しますが、ローカルハードドライブからクラスをロードする場合は、カスタムClassLoaderを使用する必要があります。
カスタムClassLoaderを作成する
カスタムClassLoaderを作成するには、を拡張する必要があります。 ClassLoader クラスをオーバーライドし、 findClass() 方法:
例:デフォルトのClassLoaderを拡張し、指定されたファイルからバイト配列をロードするカスタムClassLoaderを作成しましょう。以下のコードを参照してください。
package edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class Sample extends ClassLoader {@Override public Class findClass(String samplename)throws ClassNotFoundException {byte [] b = customLoadClassFromFile (samplename)return defineClass(samplename、b、0、b.length)} private byte [] customLoadClassFromFile(String demofilename){InputStream inStream = getClass()。getClassLoader()。getResourceAsStream(demofilename.replace( '。'、File。セパレーターChar)+ '。class')byte [] buffer ByteArrayOutputStream bStream = new ByteArrayOutputStream()int nextValue = 0 try {while((nextValue = inStream.read())!= -1){bStream.write(nextValue)}} catch(IOException e){e.printStackTrace()} buffer = bStream.toByteArray()return buffer}}
これで、JavaのClassLoaderに関するこの記事は終わりです。 JavaのClassLoaderとは何か、そのメソッド、さまざまなタイプのClassLoaderなどを理解していただければ幸いです。
「JavaのClassLoader」でこの記事を見つけた場合は、 25万人以上の満足した学習者のネットワークを持つ信頼できるオンライン学習会社であるEdurekaが世界中に広がっています。私たちはあなたの旅のすべてのステップであなたを助けるためにここにいます、このJavaインタビューの質問に加えてなるために、私たちは学生となりたい専門家のために設計されたカリキュラムを考え出します Java 開発者。
質問がありますか?この「JavaのClassLoader」のコメントセクションで言及してください。 「」 できるだけ早くご連絡いたします。