在documentation我發現:作爲類被加載由Java虛擬機 自動構造在課程加載過程中,誰首先創建了類<?>對象?
類對象和通過調用的defineClass方法 在類加載器。
我查了the source code,但沒有找到defineClass
的地方叫做例如來自loadClass方法。 你能告訴我,請誰,根據該方案呼籲defineClass
方法時:
圖片source
在documentation我發現:作爲類被加載由Java虛擬機 自動構造在課程加載過程中,誰首先創建了類<?>對象?
類對象和通過調用的defineClass方法 在類加載器。
我查了the source code,但沒有找到defineClass
的地方叫做例如來自loadClass方法。 你能告訴我,請誰,根據該方案呼籲defineClass
方法時:
圖片source
的defineClass()
方法的ClassLoader#loadClass()
調用期間調用。然而,這不是在java.lang.ClassLoader
類中直接完成的,而是在它的一個子類中,例如,在URLClassLoader#findClass()
。
ClassLoader#defineClass()
到該呼叫中的天然方法defineClass1()
或defineClass2()
一個呼叫結束。這些方法的C實現可以在OpenJDK的src/share/native/java/lang/ClassLoader.c
中找到。
java.lang.ClassLoader
就是這麼大的一類。使用你的GrepCode鏈接(這是用於java 6-b14版本),你可以在267行找到公開的loadClass
方法。
此方法中,在線308調用一個受保護的loadClass
方法和該方法中嘗試使用加載一個previosly加載的類:
findLoadedClass
這在端部調用本機方法,parent.loadClass
,findBootstrapClass0
(本地方法也)如果沒有parent
,findClass
如果沒有找到課程。這很重要,因爲ClassLoader
試圖重新使用已加載的句柄,請記住。
但是,defineClass
在哪裏被調用?這個抽象類沒有地方,但是如果你使用GrepCode的參考工具並搜索它的使用位置defineClass
(see here results),你會發現很多具體的類,最後調用definClass
。
這並不簡單,其中一些類,覆蓋defineClass
而其他調用它自己的loadClass
然後調用...等,但最後它調用defineClass
。
不要忘記,ClassLoader
defineClass
結束在該負責JVM魔術的三種天然方法之一:defineClass0
,defineClass1
和/或defineClass2
本地函數調用defineClass0
從Java_java_lang_ClassLoader_defineClass0
ClassLoader.c
和1和2功能相同。
該函數使用jvm.h
中定義的JVM_DefineClassWithSource
創建所需的類,並在openjdk\hotspot\src\share\vm\prims\jvm.cpp
中實現。
這最後一個文件定義了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內部事件(magic!)時,一個好的懷疑是事情正在本地代碼(C/C++/asm)中發生。 – Nayuki
當然可以,但問題是:它什麼時候出現(Class對象出現)?實現語言並不重要 –