実行状態では、任意のクラスについて、このクラスのすべてのプロパティとメソッドを取得でき、任意のオブジェクトについて、そのプロパティとメソッドを呼び出すことができます。この動的な情報の取得とオブジェクトのメソッドの動的な呼び出しが、Javaのリフレクションです。
クラスが持つメンバ変数とメソッドを実行時に決定 任意のオブジェクトが属するクラスを実行時に決定 クラスのオブジェクトを実行時に構築 任意のオブジェクトのメソッドを実行時に呼び出し
- jvmへのクラスファイルのロード
- クラスの解釈、クラス内の静的ブロックの実行
- .classファイルをjvmにロードし、staticの内容は実行せず、newInstanceでのみstaticブロックを実行します。
内部呼び出しはClass.forName(className,true,classloader)です。2番目のbooleanパラメータは、クラスを初期化する必要があるかどうかを示し、デフォルトではClass.forName(className)は初期化する必要があります。初期化されると、ターゲット・オブジェクトのスタティック・ブロック・コードの実行がトリガされ、スタティック・パラメータも再度初期化されます。
内部呼び出しはClassLoader.loadClass(className, false)です。2番目のbooleanパラメータは、ターゲット・オブジェクトがリンクされていることを意味します!
静的プロキシは通常ひとつのクラスをプロキシしますが、動的プロキシは インターフェイスの複数の実装をプロキシします。
静的プロキシは事前に何をプロキシするかを知っていますが、動的プロキシは実行時にしか何をプロキシするかを知りません。
動的プロキシは、JDKのInvocationHandlerインターフェイスのinvokeメソッドを実装することですが、プロキシは、インターフェイスであることに注意してください、つまり、ビジネスクラスは、インターフェイスを実装する必要がありますプロキシのnewProxyInstanceを介してプロキシオブジェクトを取得します。また、動的プロキシCGLIBは、プロキシはクラスですが、ビジネスクラスは、プロキシを実現するために派生サブクラスを介して、インターフェイスを継承する必要はありません。実行時にバイトコードを動的に変更することにより、クラスを変更する目的が達成されます。
AOPプログラミングは動的プロキシの実装に基づいており、有名なSpringフレームワークやHibernateフレームワークなどが動的プロキシの使用例です。
1、ルートクラスローダー - C + +で書かれた、ソースコードを参照してくださいしないでください
2、Extended class loader -- load location: jrelibxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx。
3、システムクラスローダ --ロード場所:クラスパス
4、カスタムローダー
- クラスのインスタンスの作成、つまりオブジェクトの新規作成
- クラスまたはインターフェースの静的変数へのアクセス、またはその静的変数への値の代入。
- クラスの静的メソッドの呼び出し
- リフレクション
- クラスのサブクラスの初期化
- JVMスタートアップ・クラス、つまり同じファイル名とクラス名を持つクラスです。
- そのクラスがまだロードされてリンクされていない場合は、最初にロードしてリンクします。
- このクラスの直接の親が存在し、クラスが初期化されていない場合は、直接の親を初期化します。
- クラス内に初期化文があると、それらの初期化文が順番に実行されます。
- .class,例:String.class
- .getClass(),例:"hello".getClass()




