最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java虛擬機(jī)裝載和初始化一個(gè)class類代碼解析

 更新時(shí)間:2017年09月11日 16:31:56   作者:DemonHunter211  
這篇文章的主要內(nèi)容是Java虛擬機(jī)裝載和初始化一個(gè)class類的代碼解析,包括介紹了裝載和初始化的時(shí)機(jī)與方式,需要的朋友可以參考下。

在 java 應(yīng)用程序開發(fā)中,只有被 java 虛擬機(jī)裝載的 Class 類型才能在程序中使用。只要生成的字節(jié)碼符合 java 虛擬機(jī)的指令集和文件格式,就可以在 JVM 上運(yùn)行,這為 java 的跨平臺(tái)性提供條件。下面,我們來看看虛擬機(jī)是如何裝載和初始化一個(gè) class 類的。

裝載一個(gè)類

學(xué)習(xí)過C/C++語言的讀者知道,C/C++源代碼必須首先別編譯成本地的機(jī)器代碼,然后還需要一個(gè)鏈接代碼過程。該鏈接過程的主要任務(wù)就是:合并不同的源碼文件產(chǎn)出的中間代碼,并最終獲得一個(gè)可直接執(zhí)行的應(yīng)用程序。然后,Java語言不是這么做的,Java應(yīng)用中類似于鏈接過程的步驟是在字節(jié)碼被裝載到JVM中之后再執(zhí)行的。

正如我們所知,JVM存在不止一個(gè)類加載器,不同的加載器使用不同的方式來加載類。但是,它們都只在必須加載類時(shí),才開始裝載類。當(dāng)然,如果已裝載完畢的類引用了某些未裝載的類,類裝載器會(huì)進(jìn)一步去裝載這些類,整個(gè)的裝載過程是遞歸的。

裝載時(shí)機(jī)與方式

在Java中,類的裝載策略是由類加載器控制的。我們使用下面這個(gè)簡(jiǎn)單的示例代碼來演示類的裝載方式與時(shí)機(jī):

// TestLoader.java
package compiler;
public class TestLoader {
public static void main(String[] args) {
System.out.println("test");
}
}
// A.java
package compiler;
public class A {
public void method(){
System.out.println("inside of A");
}
}

再看一下它們的目錄結(jié)構(gòu):

|-src
|--compiler
|------A.java
|------TestLoader.java

為了獲得每個(gè)類加載的信息,我們可以使用如下的命令來運(yùn)行程序。其中的 “-verbose:class” 參數(shù)告訴 JVM 打印出每次加載類的信息。

java -verbose:class -classpath /home/ron/workspace/UltimateTest/bin/ compiler.TestLoader

整個(gè)程序的輸出信息很繁瑣,我們摘取其中重要的部分展示如下:

[Loaded sun.misc.JavaSecurityProtectionDomainAccess from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded java.security.ProtectionDomain$2 from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded java.security.ProtectionDomain$Key from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded java.security.Principal from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded compiler.TestLoader from file:/home/xiwang/workspace/UltimateTest/bin/]
test
[Loaded java.lang.Shutdown from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded java.lang.Shutdown$Lock from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]

現(xiàn)在,假設(shè)我們把 TestLoader.java 修改成如下所示:

package compiler;
public class TestLoader {
public static void main(String[] args) {
System.out.println("test");
A a = new A();
a.method();
}
}

再次執(zhí)行同樣的運(yùn)行命令,我們獲得輸出結(jié)果變成如下所示:

[Loaded sun.misc.JavaSecurityProtectionDomainAccess from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded java.security.ProtectionDomain$2 from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded java.security.ProtectionDomain$Key from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded java.security.Principal from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded compiler.TestLoader from file:/home/xiwang/workspace/UltimateTest/bin/]
test
[Loaded compiler.A from file:/home/xiwang/workspace/UltimateTest/bin/]
inside of A
[Loaded java.lang.Shutdown from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded java.lang.Shutdown$Lock from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]

讀者可仔細(xì)查看兩者的區(qū)別,可以發(fā)現(xiàn)只有當(dāng) 類A 被使用時(shí),該類對(duì)應(yīng)的 A.class 才會(huì)被裝載??偨Y(jié)起來,一個(gè)類的加載條件是

(1) 當(dāng)使用 new 操作符執(zhí)行某類時(shí)。比如 SomeClass some = new SomeClass()。

(2)當(dāng)已加載類中有一個(gè)靜態(tài)引用指向某類時(shí)。 比如 System.out 。

初始化時(shí)機(jī)與方式

在Java中,一個(gè)類被加載完畢后,不會(huì)立即執(zhí)行類的初始化工作。當(dāng)類中的符號(hào)被第一次使用時(shí),該類才開始被初始化。在初始化順序方面:JVM會(huì)首先完成父類的初始化,再執(zhí)行子類的初始化;對(duì)于類中靜態(tài)的常量,會(huì)按照定義的先后順序完成初始化;最后會(huì)保證在初始化之前,每個(gè)屬性都會(huì)有一個(gè)默認(rèn)值。至于類中各種類型成員的初始化順序細(xì)節(jié),建議查看本站的這篇文章。

總結(jié)

以上就是本文關(guān)于虛擬機(jī)如何裝載和初始化一個(gè)Java class類的全部?jī)?nèi)容,希望對(duì)您有所幫助。

感謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論

亚东县| 阿坝| 信丰县| 盐池县| 满城县| 呼伦贝尔市| 蒙阴县| 曲周县| 日喀则市| 德令哈市| 河间市| 西乡县| 聂荣县| 冷水江市| 夏邑县| 辰溪县| 滁州市| 武强县| 民勤县| 西华县| 金溪县| 台湾省| 抚州市| 米泉市| 彭泽县| 华池县| 明水县| 施甸县| 伊金霍洛旗| 区。| 江阴市| 茂名市| 武宁县| 资阳市| 鸡泽县| 厦门市| 贺州市| 明星| 平乡县| 将乐县| 建始县|