JAVA程式的類載入及其反射機制

來源:互聯網
上載者:User

JAVA中類檔案載入是動態。JVM指令是被封裝在了. class檔案裡面,而.class檔案的載入過程是動態,也就是說當我們用到的時候才會去載入,如果不用的話,就不會去載入我們的類。這裡所說的用到包括兩種方式,第一種就是new一個對象的時候(這個時候要特別注意,當設計到多態的時候,就會有一點點變化,這時候編譯器會做一些最佳化,這樣以來當載入的時候會提前載入設計到多態的類,關於這一點下面有個例子(example 1)來說明。另一種就是當一個類的靜態代碼被調用的時候。

java 代碼
//example 1
// Zoo.java
abstract class Animal {
Animal(){
System.out.println("Animal constructor");
}
}
class Tiger extends Animal {
Tiger(){
System.out.println("Tig constructor ");
}
}
class Dog extends Animal {
Dog(){
System.out.println("Dog Constructor ");
}
}
public class Zoo {
private Animal am; //Example 1.1
//private Dog am; Example 1.2
private Tiger tiger;
Zoo(){
tiger = new Tiger();
am = new Dog();
}
public static void main(String [] args){
System.out.println("new Zoo before");
Zoo z = new Zoo();
System.out.println("new Zoo after ");
}
}

當我們注釋掉Example.1.1行時,運行Example1.2行,結果如下:

Example 1.2

分析以上兩圖的運行結果我們可以看出:當我們將子類對象賦值給父類時,編譯器會做一點最佳化,於是載入器在還沒有new 子類對象的時候已經載入了父類以及子類(example1.1結果),當不存在多態的時候,我們可以看到是當要new Dog()的時候才會載入Dog以及父類。無論何種方式,在new之前,類確實已經載入到了記憶體中。

JAVA為我們提供了兩種動態機制。第一種是隱式機制。其實new一個對象和調用類的靜態方法時,就是隱式機制在工作。第二種是顯示機制。顯示的機制又有兩種策略(第一種是用java.lang.Class的forName(String str)方法,第二種是用java.lang.ClassLoader的loadClass())。

第一種:利用forName方法

當我們查API文檔就會發現forName方法有兩種形式。分別如下:

public static Class<?> forName(String className)
throws ClassNotFoundException
public static Class<?> forName(String name,
boolean initialize,
ClassLoader loader)
throws ClassNotFoundException

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.