国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Java虛擬機裝載和初始化一個class類代碼解析

Java虛擬機裝載和初始化一個class類代碼解析

2021-01-01 12:26DemonHunter211 Java教程

這篇文章的主要內(nèi)容是Java虛擬機裝載和初始化一個class類的代碼解析,包括介紹了裝載和初始化的時機與方式,需要的朋友可以參考下。

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

裝載一個類

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

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

裝載時機與方式

在Java中,類的裝載策略是由類加載器控制的。我們使用下面這個簡單的示例代碼來演示類的裝載方式與時機:

?
1
2
3
4
5
6
7
// TestLoader.java
package compiler;
public class TestLoader {
public static void main(String[] args) {
System.out.println("test");
}
}
?
1
2
3
4
5
6
7
// A.java
package compiler;
public class A {
public void method(){
System.out.println("inside of A");
}
}

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

?
1
2
3
4
|-src
|--compiler
|------A.java
|------TestLoader.java

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

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

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

?
1
2
3
4
5
6
7
8
[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 修改成如下所示:

?
1
2
3
4
5
6
7
8
package compiler;
public class TestLoader {
public static void main(String[] args) {
System.out.println("test");
A a = new A();
a.method();
}
}

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

?
1
2
3
4
5
6
7
8
9
10
[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]

讀者可仔細查看兩者的區(qū)別,可以發(fā)現(xiàn)只有當 類A 被使用時,該類對應的 A.class 才會被裝載。總結(jié)起來,一個類的加載條件是

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

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

初始化時機與方式

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

總結(jié)

以上就是本文關(guān)于虛擬機如何裝載和初始化一個Java class類的全部內(nèi)容,希望對您有所幫助。感謝大家對本站的支持!

原文鏈接:http://blog.csdn.net/kwame211/article/details/77051010

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲综合av在线播放 | 一区视频在线 | 在线国产视频 | 欧美亚洲自拍偷拍 | 性视频网站免费 | 亚洲精品在线视频 | 精品一区二区久久久久久久网站 | av不卡在线播放 | 色噜| 欧美午夜一区二区三区 | 精品一区二区三区四区 | 精品一区二区三区免费 | 日韩一区免费在线观看 | 免费在线观看黄视频 | 精品免费国产一区二区三区四区 | 国产一级在线 | 日韩二区 | 日韩国产精品一区 | 欧美黄网站 | 国产免费色 | 人人操天天射 | 欧美在线99| 久久久精品国产 | 九九综合 | 国产乱码精品一区二区三 | 国产精品亚洲一区 | 国产亚洲精品久久久 | 91在线免费观看 | 亚洲国产精品网站 | 国产一区二区视频免费看 | 欧美一区高清 | 黄色影院在线观看 | 久久久91精品国产一区二区三区 | 久久久久久久久久久美女 | 久久久久久网站 | 欧美激情在线观看 | 亚洲午夜免费视频 | 精品国产三级 | 日韩精品专区在线影院重磅 | 国产成人一级毛片 | 欧美日韩中文字幕在线 |