Java核心--反射(一),java核心--反射

來源:互聯網
上載者:User

Java核心--反射(一),java核心--反射
JVM和類:運行java:java帶有main方法的類名啟動jvm,並載入位元組碼-------------------------------------------當調用java命令來運行某個java程式是,該命令將會啟動一個jvm進程,同一個jvm中的所有線程,變數都處於同一個進程中,共用該jvm的記憶體地區出現以下情況的時候,JVM會退出:(1)程式正常執行結束(2)使用system.out.exit(0)方法退出(3)出現異常的時候,沒有捕獲異常(4)平台強制結束JVM進程JVM進程一旦結束,該進程中記憶體的資料將會丟失
1.類載入機制:當程式主動使用某個類時,如果該類還沒有被載入進記憶體,則系統會通過載入,連結,初始化三個步驟來對該類進行初始化操作.(1)類的載入:類載入時指將類的class檔案載入記憶體中,並為之建立一個java.lang.Class對象,我們稱之為位元組碼檔案類的載入過程由類載入器完成,類載入器通常由JVM提供,我們稱之為系統類別載入器,我們也可以繼承ClassLoader類來提供自訂類載入器.不同的類載入器可以實現載入本地位元組碼檔案,jar包中的位元組碼,通過網路載入位元組碼等(2)類的連結:當類被載入進記憶體之後,系統為之產生一個對應的Class對象,接著把類的位元據合并到JRE中1>驗證:檢測被載入的類是否有正確的內部結構2>準備:賦值為類的static變數分配記憶體,並設定預設值3>解析:把類的位元據中的符號引用替換為直接引用(3)類的初始化在此階段,JVM負責對類進行初始化,主要就是對static變數進行初始化類的初始化一個類包含以下步驟:1>如果該類還未被載入和連結,則程式先載入並連結該類2>如果該類的直接父類還未被初始化,則先初始化其父類.3>如果類中有初始化語句(靜態代碼塊),則系統依次執行這些初始化語句---------------符號引用:符號引用是一個字串,它給出了被引用內容的名字並且可能會包含一些其他關於這個被引用項的資訊--這些資訊必須足以唯一的表示一個類,欄位,方法這樣對於其他類的符號引用必須給出類的全名
2.反射1.反射的理解中繼資料:描述資料的描述資料反射:得到類的中繼資料的過程在運行時期,動態去擷取一個類中的成員資訊(構造器,方法,欄位,內部類,介面,父類等方法)並且把類中的每一個成員描述成一個新的類
Class類:用來描述類或者介面的類型,描述類的類class類的執行個體:class執行個體表示正在JVM中的類或者介面(一份份位元組碼),枚舉是一種特殊的類,注釋是一種特殊的介面。當程式第一次使用一個類java.util.Date的時候,就會把改類的位元組碼載入進虛擬機器,並建立一個class對象。此時的class對象就表示java.util.Date的位元組碼class類可以表示n個位元組碼的對象,問題到底怎麼區別class類此時表示的是哪一個類的位元組碼呢?為瞭解決這個問題,class的設計者提出了泛型——>class<String>
java.lang.String 的位元組碼類型: class<java.lang.String>java.util.Date 的位元組碼類型: class<java.util.Date>java.util.Arraylist 的位元組碼類型: class<java.util.Arraylist>
如何建立class對象,如何來表示一個位元組碼?

//擷取位元組碼對象:class對象public class ClassinstanceDemo {public static void main(String[] args) throws ClassNotFoundException {// 擷取 java.util.Date類的位元組碼對象// 方式1: 使用class屬性, 類名class;Class<java.util.Date> clz = java.util.Date.class;// 方式2:通過對象的getClass方法擷取,是object中的方法java.util.Date date = new java.util.Date();Class<?> clz2 = (Class<Date>) date.getClass();// 方式3:通過class中的靜態方法forname(String className)Class<?> clz3 =Class.forName("java.util.Date");System.out.println(clz);System.out.println(clz2);System.out.println(clz3);}}


同一個類在JVM中只存在一份位元組碼檔案,也即是clz ==clz2 == clz3 第三種大量在架構中使用
2.九大內建class執行個體和數組的class執行個體
基礎資料型別 (Elementary Data Type)不能表示為對象,也就不能使用getclass的方式,基本類型沒有類名的概念,也不能使用Class.forName的方式,如何表示基礎資料型別 (Elementary Data Type)的class對象?所有的資料都有class屬性class<?> clz = 資料類型.class1.九大內建class執行個體:JVM中預先提供好的class執行個體:byte,short,int,long,float,double,char,void表示:byte.class .... void.class在八大資料類型中都有一個方法type,返回封裝類的基礎資料型別 (Elementary Data Type)位元組碼對象System.out.println(Integer.TYPE==int.class)//true;2.數組的class執行個體:數組是引用資料類型,數組其實是對象如何表示數組的class執行個體方式1:數群組類型.class方式2:數組對象.getclass;所有具有相同維數和相同元素類型的數組共用同一份位元組碼和 元素沒有關係class:描述所有的類型,所以class 應該有所有類型的相同方法object:描述所有的對象,所以在object中應該有所有對象的共同方法    
0
0
查看評論

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.