jvm類加載

Java的類與Class

  • RTTI(Run-Time Type Identification) 運行時類型識別
  • 一個Class對象就是一個類的說明書,JVM根據這個說明書來建立類的實例對象,這個說明書保存在JVM的方法區中

JVM是如何建立一個類的

有一個Cat類java

public class Cat {
    String name;
    String color;
}
複製代碼

建立一個Cat類的實例對象linux

Cat c = new Cat()
複製代碼

而後執行程序員

javac Cat.java
java Cat
複製代碼

簡單來講 大體流程以下圖數據庫

.class文件長什麼樣

有人用編輯器打開.class文件看過嗎?網絡

好比Cat.java數據結構

我使用iHex這個工具打開 Cat.class後,以十六進制展現成這個鬼樣子

咱們都知道計算機世界中是隻認識0和1的, 因此.java文件是給人類看的,而.class文件是給計算機看的jvm

二進制的.class文件是如何跑到JVM的方法區中的呢

類的加載

類的加載指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區方法區內,而後在堆區建立一個java.lang.Class對象,用來封裝類在方法區內的數據結構。類的加載的最終產品是位於堆區中的Class對象,Class對象封裝了類在方法區內的數據結構,而且向Java程序員提供了訪問方法區內的數據結構的接口。編輯器

Class對象
Class classCat = c.getClass();
複製代碼
  • classCat 是一個Class對象,全限定類名爲java.lang.Class,它是由JVM自動構造的, 也能夠理解爲類加載後的最終產物
  • Class類沒有公共的構造函數, 能夠經過如下方式獲取Class對象
    • obj.getClass()
    • Foo.class
    • Class.forName(String className)
  • Class對象表明了一個運行時的java程序中的 一個類或接口, 包含了該運行時類的信息
獲取運行時某個類中包含的方法
Arrays.stream(classCat.getMethods()).forEach(System.out::println);
複製代碼

獲取運行時某個類中包含的成員變量
Arrays.stream(classCat.getDeclaredFields()).forEach(System.out::println);
複製代碼

獲取運行時某個類中包含的構造方法

一個類在何時被加載

一個類,當它第一次被使用時,會被加載到jvm的方法區函數

.class文件的來源
  1. 從本地系統中直接加載
  2. 經過網絡下載.class文件
  3. 從zip,jar等歸檔文件中加載.class文件
  4. 從專有數據庫中提取.class文件
  5. 將Java源文件動態編譯爲.class文件

是誰在執行類的加載

相關文章
相關標籤/搜索