日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

uni中动态加载class_Java基础·类加载、反射

發(fā)布時間:2023/12/10 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uni中动态加载class_Java基础·类加载、反射 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原文:Java基礎(chǔ)·類加載、反射 - 掘金
作者:宸道移動安全團隊

15.1 類的加載概述


當程序要使用某個類時,如果該類還未被加載到內(nèi)存中,則系統(tǒng)會通過加載、連接、初始化三步來實現(xiàn)對這個類進行初始化。1.加載:是將class文件讀入內(nèi)存,并為之創(chuàng)建一個Class對象。任何類被使用時系統(tǒng)都會建立一個Class對象。
2.連接:
(1)驗證是否有正確的內(nèi)部結(jié)構(gòu),并和其他類協(xié)調(diào)一致。
(2)準備負責為類的靜態(tài)成員分配內(nèi)存,并設(shè)置默認初始化值。
(3)解析將類的二進制數(shù)據(jù)中的符號引用替換為直接。
3.初始化:就是我們以前講過的初始化步驟。15.2 類加載時機
當Java程序首次通過下面6種方式使用某個類或接口時,系統(tǒng)會初始化該類或接口。
1.創(chuàng)建類的實例。
2.訪問類的靜態(tài)變量,或者為靜態(tài)變量賦值。
3.調(diào)用類的靜態(tài)方法。
4.初始化某個類的子類。
5.直接使用java.exe命令來運行某個主類。
6.使用反射方式來強制創(chuàng)建某個類或接口對應(yīng)的java.lang.Class對象。
15.3 類加載器的概述和分類
1.類加載器負責將.class文件加載到內(nèi)存中,并為之生成對應(yīng)的Class項,在Java中,類裝載器把一個類裝入JVM中,要經(jīng)過以下步驟:
(1)裝載:查找和導入Class文件;
(2)鏈接:把類的二進制數(shù)據(jù)合并到JRE中;

  • ①校驗:檢查載入Class文件數(shù)據(jù)的正確性;
  • ②準備:給類的靜態(tài)變量分配存儲空間;
  • ③解析:將符號引用轉(zhuǎn)成直接引用;

(3)初始化:對類的靜態(tài)變量,靜態(tài)代碼塊執(zhí)行初始化操作
(4)當JVM啟動時,會形成由三個加載器組成的初始類加載器層次結(jié)構(gòu)

  • ①Bootstrap ClassLoader 根類加載器
  • ②Extension ClassLoader 擴展類加載器
  • ③System ClassLoader 系統(tǒng)類加載器

2.類加載器的作用
Bootrap ClassLoader被稱為引導(也稱為原始或跟)類加載器,它負責加載Java的核心類。跟類加載器不是java.lang.ClassLoader的子類,而是JVM自身實現(xiàn)的。在JDK中JRE的lib目錄下rt.jar文件中。
Extension ClassLoader負責加載JRE拓展目錄中的JAR包的類,它的父類加載器是跟類加載器。在JDK中JRE的lib目錄下ext目錄。
System ClassLoader負責在JVM啟動時加載來自Java命令的-classpath選項、java.class,path系統(tǒng)屬性,或CLASSPATH指定的jar包和類歷經(jīng)。系統(tǒng)可通過ClassLoader的靜態(tài)方法或區(qū)該系統(tǒng)類加載器。如果沒有特別指定,則用戶自定義的類加載器都已類加載器作為父加載器。
15.5 反射概述
JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法,同時對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性,這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象方法的功能稱為Java語言的反射機制。
1.要想解剖一個類,必須先要獲取到該類的字節(jié)碼文件對象,而解剖使用的就是Class類中的方法,所以先要獲取到每一個字節(jié)碼文件對應(yīng)的Class類型的對象。
2.每個類被加載后,系統(tǒng)會為該類生成一個對應(yīng)的Class對象,通過該Class對象可以訪問到JVM中的這個類。獲得Class對象通常有三種方式

  • (1)使用Class類的forName(String clazz)靜態(tài)方法。
  • (2)調(diào)用某個類的class屬性來獲取該類的的Class對象。
  • (3)調(diào)用某個對象的getClass()方法,該方法是Object類的一個方法。

15.6 通過反射獲取帶參和不帶參的構(gòu)造方法并使用

1.帶參與不帶參:

2.輸出:

3.Constructor:

Class類的newInstance()方法是使用該類無參的構(gòu)造函數(shù)創(chuàng)建對象。如果一個類沒有無參的構(gòu)造函數(shù), 就不能這樣創(chuàng)建了。可以調(diào)用Class類的getConstructor(String.class,int.class)方法獲取一個指定的構(gòu)造函數(shù)。然后再調(diào)用Constructor類的newInstance("張三",20)方法創(chuàng)建對象。
15.7 通過反射獲取成員變量并使用

1.Class.getField(String)方法可以獲取類中的指定字段(可見的public),

2.如果是私有的可以用getDeclaedField("name")方法獲取。

3.通過set(obj, "李四")方法可以設(shè)置指定對象上該字段的值。

4.如果是私有的需要先調(diào)用setAccessible(true)設(shè)置訪問權(quán)限,用獲取的指定的字段調(diào)用get(obj)可以獲取指定對象中該字段的值。

15.8 通過反射獲取方法并使用

1.Class.getMethod(String,Class...)
和 Class.getDeclaredMethod(String, Class...)方法可以獲取類中的指定方法。
2.調(diào)用invoke(Object, Object...)可以調(diào)用該方法。

3.私有方法:

小結(jié)

1、類加載器:

  • 過程:驗證、準備、解析。
  • 作用:裝載class。

2、反射字段和方法:

  • 反射字段:getField。
  • 反射方法:getMethod、getDeclaredMethod。

總結(jié)

以上是生活随笔為你收集整理的uni中动态加载class_Java基础·类加载、反射的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。