天天看點

java類加載(java類加載過程詳解)

Java虛拟機類加載過程是什麼樣的?
  虛拟機整個的加載過程可以分為7個階段:加載-》驗證-》準備-》解析-》初始化-》使用-》解除安裝。 
1。加載,這個過程虛拟機并沒有明确規定何時進行,但是規定了隻有以下四種情況必須立即進行加載。 
1)遇到new,getstatic,putstatic,invokestatic四條指令的時候,對應的場景:使用new關鍵字,讀取或設定一個類的靜态字段(final靜态字段除外),以及調用類的靜态方法的時候。
什麼是java類加載機制?
  getParent方法傳回的是上級類加載器 
ExtClassLoader,但是,從類檔案的觀念看,他們不是繼承關系,隻能看做引用關系 
在加載的時候,如果在我這一層,首先會去找父親,看看他加載了沒,父親再找父親的父親加載了沒, 
沒有才一步步下來,最後由我自己加載,這裡講父親,不是父類!,有點子債父還的意思 
好處是安全,因為classLoader也是個類,是以如果不用這個機制,想解析一個很簡單的類,寫病毒的人可以自己寫個classLoader用來解析這些本來系統自帶的ClassLoader就可以解析的類在裡面加點病毒代碼,這樣解析一些簡單的類的時候,它會去找加載器,找到了我自己寫的病毒Classloader,如果加載的話就出事了,java這個體系,它即使找到了病毒Classloader,也不會立刻使用,它會往上找如果他的長輩(系統自帶的能解析這個類的ClassLoader)能加載,就由系統解決了,就用不上這個病毒ClassLoader類了,是以說,比較安全!。
java 類加載先後順序
根據static的特性,在類被加載的時候執行!
是以我們可以使用static來進行測試!
測試代碼如下:
public class Test{
public static void main(String[] args){
//
}
static{
System.out.println("class Test");
}
class A{
static{
System.out.println("class A");
class B{
 static{
System.out.println("class B");
執行結果:
class Test
結論:實際上,在java中,隻有你已經用到的類,JVM才會執行加載,而且加載順序是:主類-->其他類(與在主類中被使用的順序相同)
驗證代碼如下:
public class Test{
public static void main(String[] args){
//
new A();
new B();
}
static{
System.out.println("class Test");
}
class A{
static{
System.out.println("class A");
class B{
 static{
System.out.println("class B");
執行結果:
class Test
class A
class B1.父類靜态代碼塊;
2.子類靜态代碼塊;
3.父類非靜态代碼塊;
4.父類構造函數;
5.子類非靜态代碼塊;
6.子類構造函數;
public class ExA { 
static { 
System.out.println("父類靜态代碼塊。"); 
} 
public ExA() { 
System.out.println("父類構造函數。"); 
} 
{ 
System.out.println("父類非靜态代碼塊。"); 
} 
public static void main(String[] args) { 
new ExB(); 
} 
class ExB extends ExA { 
static { 
System.out.println("子類靜态代碼塊。"); 
} 
{ 
System.out.println("子類非靜态代碼塊。"); 
} 
public ExB() { 
System.out.println("子類構造函數。"); 
} 
執行結果:父類靜态代碼塊。子類靜态代碼塊。父類非靜态代碼塊。父類構造函數。子類非靜态代碼塊。子類構造函數。父類到子類
靜态到非靜态類的加載不是在編譯的時候,編譯隻是将Java的源檔案編譯成位元組碼檔案(*.class),而,但Java程式在執行的時候才開始加載所需要的類,Java程式的入口時主方法,是以先加載的肯定是Test類,由于沒有使用到A和B類,是以執行的時候就沒有加載他們。
本人也是初學者,回答有錯誤的話請别見怪!
Java中類加載出現在哪個階段,編譯期和運作期? 類加載和類裝載是一樣的嗎
使用的類,編譯/運作時都會被加載。
加載/裝載沒有差別,翻譯的詞彙選擇因人而異了
運作 javac /java 時 加上 -verbose 選項就可以看到了。你好!
我認為java類在編譯的時候就被加載,兩個理由:
例1:import另外一個包下的類,如果到運作的時候才加載,那能import成功嗎?
例2:方法的重載,又叫編譯時多态性,類都沒有加載,哪來的方法重載?
僅代表個人觀點,不喜勿噴,謝謝。運作期。不一樣。Java中類加載出現在運作期間。類加載=類裝載 就是ClassLoader