クラスの読み込み
クラスの読み込みとは、クラス.classファイルからバイナリデータをメモリに読み取り、ランタイムデータ領域のメソッドエリアに配置し、ヒープ領域にjava.lang.classオブジェクトを作成してデータ構造をカプセル化することを指します。メソッド領域のクラスの。
ロードする方法。クラスファイル:
1。ローカルシステムから直接読み込みます
2。インターネットから.classファイルをダウンロードします
3。ZIP、JARなどからのクラスファイルをロードします。
4.独自のデータベースからクラスファイルを抽出します
5。Javaソースファイルを。クラスファイルに動的にコンパイルします
クラスロードの最終製品は、ヒープ領域にあるクラスオブジェクトです。
クラスオブジェクトは、メソッド領域のクラスのデータ構造をカプセル化し、Javaプログラマーにメソッド領域のデータ構造にアクセスするインターフェイスを提供します。
クラスローダーには2つのタイプがあります。
1. Java Virtualizerが付属するローダー
ルートクラスローダー(ブートストラップ)
拡張クラスローダー(拡張機能)
システムクラスローダーまたはアプリケーションローダー(システム)
後者の2つのローダーはJavaに実装され、ルートクラスローダーはC ++で記述されており、プログラマーはJavaコードでこのクラスを取得できません。
2。ユーザー定義のクラスローダー
java.lang.classloaderのサブクラス
ユーザーはクラスの読み込み方法をカスタマイズできます
クラスローダーは、ロードする前にクラスが最初にアクティブに使用されるまで待つ必要はありません。
JVM仕様により、クラスが使用されると予想される場合、クラスがプリロードされた場合、またはプリロードプロセス中にエラーが発生した場合、クラスローダーを初めて使用してはなりません。エラー(LinkageError)を報告します。このクラスがプログラムで積極的に使用されていない場合、クラスローダーはエラーを報告しません。
クラスのアンインストールメカニズム
クラスのライフサイクル。サンプルクラスがロードされ、接続され、初期化されます。
サンプルクラスを表すクラスオブジェクトがもはや参照されなくなった場合、つまり触れることができず、クラスオブジェクトはライフサイクルを終了し、メソッド領域のサンプルクラスのデータもアンロードされ、したがって寿命が終了します。サンプルクラスのサイクル。
クラスが終了すると、ライフサイクルがライフサイクルを表すクラスオブジェクトがいつ終了するかに依存することがわかります。
参照関係ローダーとクラスオブジェクト:
クラスローダーの内部実装では、Javaコレクションを使用して、ロードされたクラスへの参照を保存します。
一方、クラスオブジェクトは常にクラスローダーを参照します。クラスオブジェクトのgetClassLoader()メソッドを呼び出して、クラスローダーを取得します。
クラスインスタンスとそれをロードするローダーとの間に双方向の関係があることがわかります。
クラスオブジェクト、クラスオブジェクト、クラスインスタンスオブジェクト:
クラスのインスタンスは、常にクラスを表すクラスオブジェクトを指します。
getClass()メソッドは、オブジェクトクラスで定義されており、オブジェクトが属するクラスを表すクラスオブジェクトへの参照を返します。
さらに、すべてのJavaクラスには、このクラスを表すクラスオブジェクトを参照する静的プロパティクラスがあります。
クラスのアンインストール
Java仮想マシンに付属のクラスローダーがロードされたクラスは、仮想マシンのライフサイクル中にアンインストールされることはありません。
前述のように、Java仮想マシンが付属するクラスローダーには、ルートクラスローダー、拡張クラスローダー、システムクラスローダーが含まれます。
Java仮想マシン自体は常にこれらのクラスローダーを参照しており、これらのクラスローダーは常にロードされるクラスのクラスオブジェクトを参照するため、これらのクラスオブジェクトは常にアクセス可能です。
ユーザー定義のクラスローダーによってロードされたクラスは、アンロードできます。
具体的な例
roader1変数とOBJ変数は、サンプルクラスを表すクラスオブジェクトを間接的に適用し、Objclass変数はそれを直接参照します。
上記の画像の左側の3つの参照変数がプログラム操作中にnullに設定されている場合、サンプルオブジェクトはライフサイクルを終了し、MyClassoloaderオブジェクトはライフサイクルを終了し、サンプルクラスを表すクラスオブジェクトもライフを終了します。サイクルサンプルクラスは、内部のバイナリデータがアンロードされています。
再び必要な場合、サンプルクラスが存在する場合、サンプルクラスが存在しない場合、リロードされません。サンプルクラスのクラスインスタンスのヒープ領域で生成されます(ハッシュコードを介して同じインスタンスであるかどうかを確認できます)。