日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java反射在整个程序运行中的位置

發布時間:2025/6/17 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java反射在整个程序运行中的位置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

①java的核心機制

java有兩種核心機制:java虛擬機(JavaVirtual Machine)與垃圾收集機制(Garbage collection):

①Java虛擬機:是運行所有Java程序的抽象計算機,是Java語言的運行環境,在其上面運行Java代碼編譯后的字節碼程序,java虛擬機實現了平臺無關性。

②Java垃圾回收(Garbage Collection):自動釋放不用對象內存空間,在java程序運行過程中自動進行,垃圾收集機制可大大縮短編程時間,保護程序的完整性,是Java語言安全性策略的一個重要部份。

?

②java虛擬機及其結構

java垃圾回收不需要程序員手動操作,我們經常需要關注的是java虛擬機,java虛擬機承載著程序從源碼到運行的全部工作。
Java虛擬機是可運行Java代碼的假想計算機,有自己想象中的硬件,如處理器、堆棧、寄存器等,還具有相應的指令系統,可以執行 Java 的字節碼程序。Java語言的一個非常重要的特點就是與平臺的無關性。而使用Java虛擬機是實現這一特點的關鍵。Java語言使用模式Java虛擬機屏蔽了與具體平臺相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。Java虛擬機在執行字節碼時,把字節碼解釋成具體平臺上的機器指令執行。

對于 JVM 的基本結構,我們可以從下圖可以大致了解:

?

?

③程序的運行過程

從源文件創建到程序運行,Java程序要經過兩大步驟:編譯,運行;1、源文件由編譯器編譯成字節碼(ByteCode) 2、字節碼由java虛擬機解釋運行。

①第一步(編譯): 創建完源文件之后,程序會被編譯器編譯為.class文件。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然后引用,否則直接引用。。編譯后的字節碼文件格式主要分為兩部分:常量池和方法字節碼。

②第二步(運行):java類運行的過程大概可分為兩個過程:1、類的加載 2、執行。

?

④類的加載

java程序經過編譯后形成*.class文件。通過類加載器將字節碼(*.class)加載入JVM的內存中。JVM將類加載過程分成加載,連接,初始化三個階段,其中連接階段又可分為驗證,準備,解析三個階段。

?

)))類加載過程

JVM 的類加載是通過 ClassLoader 及其子類來完成的,類的層次關系和加載順序可以由下圖來描述

①Bootstrap ClassLoader啟動類加載器

負責加載$JAVA_HOME中jre/lib/里所有的 class(JDK 代表 JDK 的安裝目錄,下同),或被-Xbootclasspath參數指定的路徑中的,并且能被虛擬機識別的類庫(如 rt.jar,所有的java.*開頭的類均被 Bootstrap ClassLoader 加載)。啟動類加載器由 C++ 實現,不是 ClassLoader 子類。無法被 Java 程序直接引用的。

?

②Extension ClassLoader擴展類加載器

該加載器由sun.misc.Launcher

?

ExtClassLoaderJavajar括?ExtClassLoader實現,負責加載Java平臺中擴展功能的一些jar包,包括 JAVA_HOME中jre/lib/.jar或-Djava.ext.dirs指定目錄下的 jar 包。即JDK\jre\lib\ext目錄中,或者由 java.ext.dirs 系統變量指定的路徑中的所有類庫(如javax.開頭的類),開發者可以直接使用擴展類加載器

③App ClassLoader應用程序類加載器

。該類加載器由 sun.misc.Launcher$AppClassLoader 來實現,負責記載 classpath 中指定的 jar 包及目錄中 class,開發者可以直接使用該類加載器,如果應用程序中沒有自定義過自己的類加載器,一般情況下這個就是程序中默認的類加載器。

啟動類加載器:它使用 C++ 實現(這里僅限于 Hotspot,也就是 JDK1.5 之后默認的虛擬機,有很多其他的虛擬機是用 Java 語言實現的),是虛擬機自身的一部分。
所有其他的類加載器:這些類加載器都由 Java 語言實現,獨立于虛擬機之外,并且全部繼承自抽象類 java.lang.ClassLoader,這些類加載器需要由啟動類加載器加載到內存中之后才能去加載其他的類。
應用程序都是由這三種類加載器互相配合進行加載的,我們還可以加入自定義的類加載器。

?

?

?

①加載

加載時類加載過程的第一個階段,在加載階段,虛擬機需要完成以下三件事情:

①通過一個類的全限定名來獲取其定義的二進制字節流。

②將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構。

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

注意,這里第 1 條中的二進制字節流并不只是單純地從 Class 文件中獲取,比如它還可以從 Jar 包中獲取、從網絡中獲取(最典型的應用便是 Applet)、由其他文件生成(JSP 應用)等。

相對于類加載的其他階段而言,加載階段(準確地說,是加載階段獲取類的二進制字節流的動作)是可控性最強的階段,因為開發人員既可以使用系統提供的類加載器來完成加載,也可以自定義自己的類加載器來完成加載。

相對于類加載的其他階段而言,加載階段(準確地說,是加載階段獲取類的二進制字節流的動作)是可控性最強的階段,因為開發人員既可以使用系統提供的類加載器來完成加載,也可以自定義自己的類加載器來完成加載。

JVM主要在程序第一次主動使用類的時候,才會去加載該類。也就是說,JVM并不是在一開始就把一個程序就所有的類都加載到內存中,而是到用的時候才把它加載進來,而且只加載一次

?

加載過程中會先檢查類是否被已加載,檢查順序是自底向上,從 Custom ClassLoader 到 BootStrap ClassLoader 逐層檢查,只要某個 Classloader 已加載就視為已加載此類,保證此類只所有 ClassLoade r加載一次。而加載的順序是自頂向下,也就是由上層來逐層嘗試加載此類。
這幾種類加載器的層次關系如下圖所示:

這種層次關系稱為類加載器的雙親委派模型。雙親委派模型的工作流程是:

如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把請求委托給父加載器去完成,依次向上 因此,所有的類加載請求最終都應該被傳遞到頂層的啟動類加載器中,只有當父加載器在它的搜索范圍中沒有找到所需的類時,即無法完成該加載,子加載器才會嘗試自己去加載該類。

?

②連接

①驗證

驗證的目的是為了確保 Class 文件中的字節流包含的信息符合當前虛擬機的要求,而且不會危害虛擬機自身的安全。不同的虛擬機對類驗證的實現可能會有所不同,但大致都會完成以下四個階段的驗證:文件格式的驗證、元數據的驗證、字節碼驗證和符號引用驗證。

?

②準備

準備階段是正式為類變量分配內存并設置類變量初始值的階段,這些內存都將在方法區中分配。對于該階段有以下幾點需要注意:

這時候進行內存分配的僅包括類變量(static),而不包括實例變量,實例變量會在對象實例化時隨著對象一塊分配在 Java 堆中。 這里所設置的初始值通常情況下是數據類型默認的零值(如 0、0L、null、false 等),而不是被在 Java 代碼中被顯式地賦予的地賦予的值。

?

③解析

解析階段是虛擬機將常量池中的符號引用轉化為直接引用的過程。

解析動作主要針對類或接口、字段、類方法、接口方法四類符號引用進行,分別對應于常量池中的 CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info、CONSTANT_InterfaceMethodref_info 四種常量類型。

?

?

③初始化

類初始化是類加載過程的最后一個階段,到初始化階段,才真正開始執行類中的 Java 程序代碼。虛擬機規范嚴格規定了有且只有四種情況必須立即對類進行初始化:

      

①遇到 new、getstatic、putstatic、invokestatic 這四條字節碼指令時,如果類還沒有進行過初始化,則需要先觸發其初始化。生成這四條指令最常見的 Java 代碼場景是:使用 new 關鍵字實例化對象時、讀取或設置一個類的靜態字段(static)時(被 static 修飾又被 final 修飾的,已在編譯期把結果放入常量池的靜態字段除外)、以及調用一個類的靜態方法時。 ②使用 Java.lang.refect 包的方法對類進行反射調用時,如果類還沒有進行過初始化,則需要先觸發其初始化。 ③當初始化一個類的時候,如果發現其父類還沒有進行初始化,則需要先觸發其父類的初始化。 ④當虛擬機啟動時,用戶需要指定一個要執行的主類,虛擬機會先執行該主類

?
虛擬機規定只有這四種情況才會觸發類的初始化,稱為對一個類進行主動引用,除此之外所有引用類的方式都不會觸發其初始化,稱為被動引用

?

?

⑤靜態加載和動態加載

Java初始化一個類的時候可以用new 操作符來初始化,也可通過Class.forName的方式來得到一個Class類型的實例,然后通過這個Class類型的實例的newInstance來初始化.我們把前者叫做JAVA的靜態加載,把后者叫做動態加載.。

時候我們說某個語言具有很強的動態性,有時候我們會區分動態和靜態的不同技術與作法。我們朗朗上口動態綁定(dynamic binding)、動態鏈接(dynamic linking)、動態加載(dynamic loading)等。然而“動態”一詞其實沒有絕對而普遍適用的嚴格定義,有時候甚至像面向對象當初被導入編程領域一樣,一人一把號,各吹各的調。
一般而言,開發者社群說到動態語言,大致認同的一個定義是:“程序運行時,允許改變程序結構或變量類型,這種語言稱為動態語言”。從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言。
盡管在這樣的定義與分類下Java不是動態語言,它卻有著一個非常突出的動態相關機制:Reflection。Java程序可以加載一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),并生成其對象實體、或對其fields設值、或喚起其methods。

靜態加載的時候如果在運行環境中找不到要初始化的類,拋出的是NoClassDefFoundError,它在JAVA的異常體系中是一個Error.

動態態加載的時候如果在運行環境中找不到要初始化的類,拋出的是ClassNotFoundException,它在JAVA的異常體系中是一個checked異常,在寫代碼的時候就需要catch.

?

⑥反射

①獲取class

②獲取構造方法

③獲取類的成員方法

④獲取類的成員變量(成員屬性)

?反射機制將另起篇幅學習

?

⑦程序運行

?

?

學習并轉載自https://blog.csdn.net/u012585964/article/details/52011138/

轉載于:https://www.cnblogs.com/baxianhua/p/9487213.html

總結

以上是生活随笔為你收集整理的Java反射在整个程序运行中的位置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 污污视频在线看 | 免费在线观看污 | 看黄色的网址 | 萌白酱一区二区 | 天堂网www| 淫僧荡尼巨乳(h)小说 | 成人做爰免费视频免费看 | 成年人免费黄色片 | 用舌头去添高潮无码视频 | 国产人成无码视频在线观看 | 人人九九精品 | 国产片网址 | 国产电影一区二区三区爱妃记 | 黄色片国产 | 久久999| 日韩av午夜 | 好看的中文字幕电影 | 国产一区二区三区精品愉拍 | 超碰97在线看| 欧美性一区二区三区 | 午夜av导航| 亚洲精品www久久久久久广东 | 精品在线视频观看 | 亚洲精品一区二区18漫画 | av无限看 | 97成网| 久久精品伦理 | 国产乡下妇女三片 | 尤物视频免费观看 | 日本欧美www | 少妇一级淫免费播放 | 久久aⅴ乱码一区二区三区 亚洲成人18 | 亚洲一区网 | 天天操天天射天天 | 无码人妻丰满熟妇区毛片蜜桃精品 | 国产一区二区三区在线观看免费 | 内裤摩擦1v1h | 91麻豆国产福利精品 | 亚洲福利在线播放 | 国产欧美激情在线观看 | 骚黄网站| 色无极亚洲影院 | av女优天堂在线观看 | 一级淫片免费看 | 激情网色 | 魔女鞋交玉足榨精调教 | 亚洲一区和二区 | 日本精品在线视频 | 亚洲欧美激情另类校园 | 免费av成人 | 中文字幕影片免费在线观看 | 色女人网站 | 91看片在线 | 老司机深夜福利在线观看 | 可以免费看污视频的网站 | 公肉吊粗大爽色翁浪妇视频 | 男人爽女人下面动态图 | 色黄网站在线观看 | 欧美一级艳片视频免费观看 | 日韩香蕉网 | 捆绑调教sm束缚网站 | 色老板精品凹凸在线视频观看 | 91射| 女女互慰吃奶互揉调教捆绑 | 九九看片| 潘金莲激情呻吟欲求不满视频 | aa丁香综合激情 | 琪琪色在线观看 | 久艹av | 国产成人精品免费网站 | 亚洲手机av| 三年大片在线观看 | 捆绑凌虐一区二区三区 | 丰满少妇一区二区 | 亚洲美女福利 | 无码国产69精品久久久久网站 | 成人无码久久久久毛片 | 一二三区中文字幕 | 国产熟妇一区二区三区四区 | 青青草福利视频 | 狠狠插av| 美女性高潮视频 | 久久久久美女 | 日本网站免费观看 | 久久久免费在线观看 | 香蕉视频国产在线观看 | 九九热视 | 能免费看18视频网站 | 黄色综合网| 日韩人妻无码精品综合区 | 天堂va蜜桃一区二区三区 | 一本一道久久a久久精品蜜桃 | www.日本在线 | 蜜臀av性久久久久蜜臀aⅴ麻豆 | 国家队动漫免费观看在线观看晨光 | 少妇被狂c下部羞羞漫画 | 欧美草比视频 | 无码精品国产一区二区三区 | 精品乱码一区二区三四区视频 |