導航:首頁 > 源碼編譯 > 編譯原理和類載入器

編譯原理和類載入器

發布時間:2022-09-11 11:20:50

⑴ 請問java的類載入器有啥作用,它的價值是什麼

載入class文件,你得java生成文件為.class文件
需要類載入器去載入實現。

⑵ java源代碼為什麼要編譯

程序設計高級語言的原理都是相似的。JAVA,C,C++,等都類似。
說一下JAVA的:
我們先把自然語言,也就是我們平時的話寫成程序設計高級語言,這是編程
然後再通過編譯器生成class也就是位元組碼文件,這個過程是編譯。此時的class文件我們也可以稱之為二進制碼,就是計算機可識別的0,1文件了。而編譯是計算機內部運行,不需要編程者操作。
.java是以源文件形式存在,是編譯器和我們都可識別的語言。
編譯器識別了.java文件後生成.class文件,是編譯器和計算機可識別的語言。
然後計算機會使同名的.java和.class文件關聯,計算機自己有兩次翻譯過程,而這個過程操作者並不需要操心。之後我們就可以運行.java文件了。

⑶ 對於開發人員編寫的類載入器來說,其父類載入器是載入此類載入器Java類的類載入器。

在某個類載入器試圖以自己的方式載入一個類時,它首先預設把這個工作交給自己的父對象。而這個父對象又會首先把這個任務交給自己的父對象處理,這樣這個任務會一直傳到啟動類載入器,因為啟動類載入器通常是代理鏈的最後一個類。如果父類載入器能夠載入這個類型,就會返回此類型,否則由子類載入器處理。

⑷ java 類載入機制有什麼用

AVA類載入機制詳解

「代碼編譯的結果從本地機器碼轉變為位元組碼,是存儲格式發展的一小步,卻是變成語言發展的一大步」,這句話出自《深入理解JAVA虛擬機》一書,後面關於jvm的系列文章主要都是參考這本書。

JAVA源碼編譯由三個過程組成:

1、源碼編譯機制。

2、類載入機制

3、類執行機制

我們這里主要介紹編譯和類載入這兩種機制。

一、源碼編譯

代碼編譯由JAVA源碼編譯器來完成。主要是將源碼編譯成位元組碼文件(class文件)。位元組碼文件格式主要分為兩部分:常量池和方法位元組碼。

二、類載入

類的生命周期是從被載入到虛擬機內存中開始,到卸載出內存結束。過程共有七個階段,其中到初始化之前的都是屬於類載入的部分

載入----驗證----准備----解析-----初始化----使用-----卸載

系統可能在第一次使用某個類時載入該類,也可能採用預載入機制來載入某個類,當運行某個java程序時,會啟動一個java虛擬機進程,兩次運行的java程序處於兩個不同的JVM進程中,兩個jvm之間並不會共享數據。

1、載入階段

這個流程中的載入是類載入機制中的一個階段,這兩個概念不要混淆,這個階段需要完成的事情有:

1)通過一個類的全限定名來獲取定義此類的二進制位元組流。

2)將這個位元組流所代表的靜態存儲結構轉化為方法區的運行時數據結構。

3)在java堆中生成一個代表這個類的Class對象,作為訪問方法區中這些數據的入口。

由於第一點沒有指明從哪裡獲取以及怎樣獲取類的二進制位元組流,所以這一塊區域留給我開發者很大的發揮空間。這個我在後面的類載入器中在進行介紹。

2、准備階段

這個階段正式為類變數(被static修飾的變數)分配內存並設置類變數初始值,這個內存分配是發生在方法區中。

1、注意這里並沒有對實例變數進行內存分配,實例變數將會在對象實例化時隨著對象一起分配在JAVA堆中。

2、這里設置的初始值,通常是指數據類型的零值。

private static int a = 3;

這個類變數a在准備階段後的值是0,將3賦值給變數a是發生在初始化階段。

3、初始化階段

初始化是類載入機制的最後一步,這個時候才正真開始執行類中定義的JAVA程序代碼。在前面准備階段,類變數已經賦過一次系統要求的初始值,在初始化階段最重要的事情就是對類變數進行初始化,關注的重點是父子類之間各類資源初始化的順序。

java類中對類變數指定初始值有兩種方式:1、聲明類變數時指定初始值;2、使用靜態初始化塊為類變數指定初始值。

初始化的時機

1)創建類實例的時候,分別有:1、使用new關鍵字創建實例;2、通過反射創建實例;3、通過反序列化方式創建實例。

new Test();
Class.forName(「com.mengdd.Test」);

2)調用某個類的類方法(靜態方法)

Test.doSomething();

3)訪問某個類或介面的類變數,或為該類變數賦值。

int b=Test.a;
Test.a=b;

4)初始化某個類的子類。當初始化子類的時候,該子類的所有父類都會被初始化。

5)直接使用java.exe命令來運行某個主類。

除了上面幾種方式會自動初始化一個類,其他訪問類的方式都稱不會觸發類的初始化,稱為被動引用。

1、子類引用父類的靜態變數,不會導致子類初始化。

執行結果:

MIGU

用final修飾某個類變數時,它的值在編譯時就已經確定好放入常量池了,所以在訪問該類變數時,等於直接從常量池中獲取,並沒有初始化該類。

初始化的步驟

1、如果該類還沒有載入和連接,則程序先載入該類並連接。

2、如果該類的直接父類沒有載入,則先初始化其直接父類。

3、如果類中有初始化語句,則系統依次執行這些初始化語句。

在第二個步驟中,如果直接父類又有直接父類,則系統會再次重復這三個步驟來初始化這個父類,依次類推,JVM最先初始化的總是java.lang.Object類。當程序主動使用任何一個類時,系統會保證該類以及所有的父類都會被初始化。

⑸ 描述一下JVM載入class文件的原理

Java語言是一種具有動態性的解釋型語言,類(class)只有被載入到JVM中後才能運行。當運行指定程序時,JVM會將編譯生成的.class文件按照需求和一定的規則載入到內存中,並組織成為一個完整的Java應用程序。這個載入過程是由類載入器來完成的,具體來說,就是由ClassLoader和它的子類來實現的。類載入器本身也是一個類,其實質是把類文件從硬碟讀取到內存中。
類的載入方式分為隱式載入與顯式載入兩種。隱式載入指的是程序在使用new等方法創建對象時,會隱式地調用類的載入器把對應的類載入到JVM中。顯式載入指的是通過直接調用class.forName()方法來把所需要的類載入到JVM中。
任何一個工程項目都是由許多個類組成的,當程序啟動時,只把需要載入的類載入到JVM中,其他類只有被使用到的時候才會被載入,採用這種方法,一方面可以加快載入速度,另外一方面可以節約程序運行過程中對內存的開銷。此外,在Java語言中,每個類或介面都對應一個.class文件,這些文件可以被看成一個個可以被動態載入的單元,因此當只有部分類被修改時,只需要重新編譯變化的類即可,而不需要重新編譯所有文件,因此加快了編譯速度。

⑹ java中類載入器是怎麼工作的

JVM將類載入過程分為三個步驟:裝載(Load),鏈接(Link)和初始化(Initialize)
鏈接又分為三個步驟,驗證、准備、解析
1) 裝載:查找並載入類的二進制數據;
2)鏈接:
驗證:確保被載入類的正確性;
准備:為類的靜態變數分配內存,並將其初始化為默認值;
解析:把類中的符號引用轉換為直接引用;
3)初始化:為類的靜態變數賦予正確的初始值;
那為什麼我要有驗證這一步驟呢?首先如果由編譯器生成的class文件,它肯定是符合JVM位元組碼格式的,但是萬一有高手自己寫一個class文件,讓JVM載入並運行,用於惡意用途,就不妙了,因此這個class文件要先過驗證這一關,不符合的話不會讓它繼續執行的,也是為了安全考慮吧。
准備階段和初始化階段看似有點牟盾,其實是不牟盾的,如果類中有語句:private static int a = 10,它的執行過程是這樣的,首先位元組碼文件被載入到內存後,先進行鏈接的驗證這一步驟,驗證通過後准備階段,給a分配內存,因為變數a是static的,所以此時a等於int類型的默認初始值0,即a=0,然後到解析(後面在說),到初始化這一步驟時,才把a的真正的值10賦給a,此時

⑺ 什麼是類的載入,何時載入

當程序主動使用某個類時,如果該類還未被載入到內存中,系統會通過載入,連接,初始化三個步驟來對該類進行初始化,JVM將會連續完成這三個步驟,也把這三個步驟統稱為類載入或類初始化。
類載入指的是將類Class文件讀入內存,並為之創建一個java.lang.Class對象,也就是說程序使用任何類時,系統都會為之建立一個java.lang.Class對象
類是某一類對象的抽象,類是概念層次的東西,但類也是一種對象,每個類是一批具有相同特徵的對象的抽象,而系統中所有類,它們實際上也是對象,都是java.lang.Class的實例
類的載入由類載入器完成,類載入器通常由JVM提供,這些類載入器也是所有程序運行的基礎,JVM提供的這些類載入器通常被稱為系統類載入器,開發者也可以通過繼承ClassLoader基類來創建自己的類載入器
通過使用不同的類載入器,可以從不同來源載入類的二進制數據,通常有如下幾種來源:1.從本地文件系統來載入Class文件,這是大部分實常式序的類載入方式
2從jar包中載入class文件,如JDBC編程時用到的資料庫驅動類就是放在jar文件中,JVM可以從jar文件中直接載入該Class文件
3.通過網路載入class文件
4.把一個java源文件動態編譯,並執行載入。

⑻ JAVA開發工程師必須懂什麼

java Netty實戰課程java高性能分布式RPC教程課程 免費下載

鏈接:https://pan..com/s/1MpUM62h4nvHnUGMan-R6YA

提取碼:kvvv

Java是一門面向對象的編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程

⑼ classloader的原理 有哪些類載入器 為什麼要用自定義類載入器

原理之類的,你自己上網看資料吧,不是一兩句話說得清的。

至於為什麼用自定義類載入器,個人總結了一下可能有下面幾點吧,可能不全,也請大家補充:

  1. 加密:眾所周知,java代碼很容易被反編譯,如果你需要把自己的代碼進行加密,可以先將編譯後的代碼用某種加密演算法加密,然後實現自己的類載入器,負責將這段加密後的代碼還原。

  2. 從非標準的來源載入代碼:例如你的部分位元組碼是放在資料庫中甚至是網路上的,就可以自己寫個類載入器,從指定的來源載入類。

  3. 動態創建:為了性能等等可能的理由,根據實際情況動態創建代碼並執行。

  4. 其他(這個理由非常給力吧^_^)

閱讀全文

與編譯原理和類載入器相關的資料

熱點內容
卡爾曼濾波演算法書籍 瀏覽:765
安卓手機怎麼用愛思助手傳文件進蘋果手機上 瀏覽:841
安卓怎麼下載60秒生存 瀏覽:800
外向式文件夾 瀏覽:233
dospdf 瀏覽:428
怎麼修改騰訊雲伺服器ip 瀏覽:385
pdftoeps 瀏覽:490
為什麼鴻蒙那麼像安卓 瀏覽:733
安卓手機怎麼拍自媒體視頻 瀏覽:183
單片機各個中斷的初始化 瀏覽:721
python怎麼集合元素 瀏覽:477
python逐條解讀 瀏覽:829
基於單片機的濕度控制 瀏覽:496
ios如何使用安卓的帳號 瀏覽:880
程序員公園采訪 瀏覽:809
程序員實戰教程要多長時間 瀏覽:972
企業數據加密技巧 瀏覽:132
租雲伺服器開發 瀏覽:811
程序員告白媽媽不同意 瀏覽:333
攻城掠地怎麼查看伺服器 瀏覽:600