Classオブジェクトは、クラスがロードされる際にJava仮想マシン によって自動的に構成され、クラスローダでdefineClassメソッド への呼び出しでされています。
the source codeを確認しましたが、場所が見つかりませんでしたdefineClass
と呼びます。 loadClassメソッドから取得します。
ピクチャーsource
Classオブジェクトは、クラスがロードされる際にJava仮想マシン によって自動的に構成され、クラスローダでdefineClassメソッド への呼び出しでされています。
the source codeを確認しましたが、場所が見つかりませんでしたdefineClass
と呼びます。 loadClassメソッドから取得します。
ピクチャーsource
defineClass()
方法はClassLoader#loadClass()
の呼び出し中に呼び出されます。 あなたは私、してください、誰と通話defineClass
方法このスキームに従って示すことができました。しかしながら、これはjava.lang.ClassLoader
クラス内ではなく、そのサブクラスの1つ、例えば、 URLClassLoader#findClass()
。
ClassLoader#defineClass()
への呼び出しがネイティブ方法defineClass1()
またはdefineClass2()
の1への呼び出しで終わります。これらのメソッドのC実装はOpenJDKのsrc/share/native/java/lang/ClassLoader.c
にあります。
java.lang.ClassLoader
は、このような大きなクラスです。 GrepCodeリンク(はjava 6-b14バージョン)を使用すると、267行目にpublic loadClass
メソッドがあります。
この方法では、ライン308で保護loadClass
メソッドを呼び出し、このメソッドは使用してprevioslyロードされたクラスをロードしよう:、両端にネイティブメソッドを呼び出します
findLoadedClass
、parent.loadClass
を呼び出すfindBootstrapClass0
(ネイティブメソッド)parent
,ClassLoader
は既にロードされているクローズを再利用しようとしているので、これは重要なことです。
ただし、defineClass
はどこに呼び出されますか?この抽象クラスからの場所はありませんが、GrepCodeの参照ツールを使用して、どこで使用されているのかを調べる場合はdefineClass
(see here results)、多くの具体的なクラスがあります。具体的なクラスは末尾にdefinClass
となります。
それは他の人がそのように上の呼び出し、...と、独自のloadClass
を呼び出しながら、これらのクラスのいくつかは、defineClass
をオーバーライドし、簡単ではないですが、最終的にはdefineClass
を呼び出します。
ClassLoader
のdefineClass
はJVM の責任である3つのネイティブメソッド魔法の一つで終わることを忘れないでください:defineClass0
、defineClass1
および/またはdefineClass2
からJava_java_lang_ClassLoader_defineClass0
を呼び出すdefineClass0
ネイティブ機能ClassLoader.c
と1と2の関数で同じです。
この関数は、jvm.h
で定義され、openjdk\hotspot\src\share\vm\prims\jvm.cpp
に実装されたJVM_DefineClassWithSource
を使用して、必要なクラスを作成します。
この最後のファイルは、最終的に必要なクラスを作成する関数jvm_define_class_common
を定義しています。最後に、この関数はJNIHandles::make_local
を呼び出してクラスを割り当てます。この最後の機能のコードはopenjdk\hotspot\src\share\vm\runtime\jniHandles.cpp
でご覧になれます。
class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// load the class data from the connection
. . .
}
}
これはOracle dosumentation.defineClassの抽出ファイルです。ClassLoaderのメソッドで、バイト配列をClassクラスのインスタンスに変換します。 私はそれが役に立ちそうです – Hiren
JVMの内部(マジック!)を扱うとき、ネイティブコード(C/C++/asm)で状況が起こっている可能性があるというのは良い疑いがあります。 – Nayuki
確かにそれは可能かもしれませんが、質問は次のとおりです:それはいつ(クラスオブジェクトが現れる)ですか?実装言語は関係ありません –