⑴ java如何載入一個外部的類或class文件
不知道你用的什麼開發軟體,本人用的是MyEclipse,在裡面想要載入一個存在的java文件 可以直接將該java文件復制到該工程內,或者將class文件復制到bin目錄中,或者是一樓那位仁兄說的打成jar包,然後導入後者直接復制到bin目錄下
路徑寫全,就是你那個要導入的類的package 後面的包名.類名
如mysql的驅動com.mysql.jdbc.Driver
⑵ java如何實現類載入
重新定義類載入器,也就是ClassLoader,覆蓋其中的一個方法findClass
例如,應用程序可以創建一個網路類載入器,從伺服器中下載類文件。示例代碼如下所示:
ClassLoader loader = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();
. . .
⑶ JVM之class載入過程
java虛擬機把描述類的數據從class文件載入到內存,並對數據進行 校驗/准備/解析和初始化,最終形成可以被虛擬機直接使用的Java類型,這個過程被稱作虛擬機的類載入機制。
稱作虛擬機的類載入機制。
loading -> linking (verification -> preparation -> resolution)-> resolution)->initializing
loading: 把class文件load到內存中,採用雙親委派,主要是為了安全性
verification: 校驗class文件是否符合標准
preparation: 靜態變數分配內存並設初始值的階段(不包括實例變數)
resolution:把符號引用轉換為直接引用
initializing:靜態變數賦初始值
類載入的過程主要分為三個部分:載入、連接、初始化這三個階段。
類的載入指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然後在堆區創建一個這個類的java.lang.Class對象,用來封裝類在方法區類的對象。主要步驟可以分為下面的三件事情:
載入階段完成後,虛擬機外部的 二進制位元組流就按照虛擬機所需的格式存儲在方法區之中,而且在Java堆中也創建一個java.lang.Class類的對象,這樣便可以通過該對象訪問方法區中的這些數據。
類的載入的最終產品是位於堆區中的Class對象。Class對象封裝了類在方法區內的數據結構,並且向Java程序員提供了訪問方法區內的數據結構的介面。載入類的方式有以下幾種:
2.載入器
JVM的類載入是通過ClassLoader及其子類來完成的,類的層次關系和載入順序可以由下圖來描述:
1.BootstrapClassLoader(啟動類載入器)
在連接裡面又可以被分成3個小階段,分別是:驗證,准備,解析
1.驗證(目的):
2.驗證內容:
驗證是連接階段的第一步,這一階段的目的是為了確保Class文件的位元組流中包含的信息符合當前虛擬機的要求,並且不會危害虛擬機自身的安全。驗證階段大致會完成4個階段的檢驗動作:
驗證階段是非常重要的,但不是必須的,它對程序運行期沒有影響,如果所引用的類經過反復驗證,那麼可以考慮採用-Xverifynone參數來關閉大部分的類驗證措施,以縮短虛擬機類載入的時間。
3.准備:
在准備階段,為靜態變數的初值為jvm默認的初值,而不是我們在程序中設定的初值。jvm默認為靜態變數的初值是這樣的
4.解析:
這一階段的任務就是把常量池中的符號引用轉換為直接引用 什麼是符號引用,什麼是直接引用。
1.工作內容:
JVM負責主要對類變數(類變數就是static修改的變數)進行初始化這里主要對類變數(類變數就是static修改的變數)進行初始化,初始化主要有兩個方式:
2.初始化時機:
類初始化時機:只有當對類的主動使用的時候才會導致類的初始化,類的主動使用包括以下六種:
3.初始化順序:
如果有父類,則順序是:父類static方法/static變數賦值 –> 子類static方法/static變數賦值
三、結語:
上面介紹的就是類(class)的載入,包含它的載入、鏈接、初始化。
Android進階知識點,我最近整理了許多,裡面講解的非常詳細。取
https://docs.qq.com/doc/DUkNRVFFzTG96VHNiAndroid 技術進階手冊丶面試題綱丶核心筆記資料。
⑷ java的類載入器有哪些,它們的順序是什麼
類載入器有四種,分別是 bootstrapClassLoader (主要載入java核心api) , ExtClassLoaders是擴展類的類載入器,AppClassLoader 程序類載入器,還有一個是用戶繼承ClassLoader重寫的類載入器。
⑸ Java中隱式載入一個class時,使用那個類載入器注意當前類的載入器不是
應用程序類載入器(Application ClassLoader):
這個載入器由sun.misc.Launcher$AppClassLoader實現,它負責載入classpath對應的jar及目錄。一般情況下這個就是程序中默認的類載入器。
⑹ java文件是怎麼執行的
首先:使用javac命令把.java文件編譯成.class文件(位元組碼文件)
然後:JVM(java虛擬機)裝載.class文件並翻譯成機器碼後運行java程序;
共同學習-----請參考:
我們手工執行java程序是這樣的:
1 在記事本中或者是UE的文本編輯器中,寫好源程序;
2 使用javac命令把源程序編譯成.class文件;
編譯後的.class(類位元組碼)文件中會包含以下內容:
ConstantPool:符號表;
FieldInfo:類中的成員變數信息;
MethodInfo:類中的方法描述;
Attribute:可選的附加節點。
FieldInfo節點包含成員變數的名稱,諸如public,private,static等的標志。ConstantValue屬性用來存儲靜態的不變的成員變數的值。Deprecated和Synthetic被用來標記一個成員變數是不被推薦的或由編譯器生成的。
3 有了.class文件,我們執行 java 解釋命令就可以運行java程序了。
現在我們主要討論一下,當執行 java這個命令後,會發生什麼事情呢?
首先,JVM裝載.class,也就是類裝載器裝載類位元組碼。一個類裝載器本身也是一個java類,所以,類裝載器自身也需要被另外一個類裝載器裝載,這就出現了類似先有蛋,還是先有雞的問題。但JAVA中的類裝載器的這個問題卻很容易解決。JAVA的虛擬機(JVM)中內嵌了一個稱為Bootstrap類裝載器,它是用特定於操作系統的本地代碼實現的,屬於JAVA虛擬機的內核,Bootstrap類不用專門的類裝載器去進行裝載。Bootstrap類負責載入JAVA核心包中的類(即rt.jar文件中的類),這些類的Class.getClassLoader()方法返回值為null,即表示是Bootstrap類裝載器。JAVA核心包中有另外兩個類裝載器:ExtClassLoader和AppClassLoader,它們都是用JAVA語言編寫的JAVA類,其中ExtClassLoader類裝載負責載入存放在<JAVA_HOME>/jre/lib/ext目錄下的jar包中的類,AppClassLoader負責載入應用程序的啟動執行類,即當使用java命令去啟動執行一個類時,JAVA虛擬機使用AppClassLoader載入這個類。在編譯和運行JAVA程序時,都會通過ExtClassLoader類裝載器去<JAVA_HOME>/jre/lib/ext目錄下的JAR包中搜索要載入的類,所以,如果將包含例如Servlet API的jar包或者是javamail.jar包復制到該目錄下,在編譯Servlet或JavaMail程序時,就不必在CLASSPATH環境變數中增加包含Servlet API的jar包或者是javamail.jar包文件。
以上,就是一個JAVA程序執行的大致過程。
⑺ Java類載入機制
1,類的載入
每個開發人員對java.lang.ClassNotFoundExcetpion這個異常肯定都不陌生,這背後就涉及到了java技術體系中的類載入。Java的類載入機制是技術體系中比較核心的部分,雖然和大部分開發人員直接打交道不多,但是對其背後的機理有一定理解有助於排查程序中出現的類載入失敗等技術問題,對理解java虛擬機的連接模型和java語言的動態性都有很大幫助。
那麼什麼是類的載入?
類的載入指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然後在堆區創建一個java.lang.Class對象,用來封裝類在方法區內的數據結構。類的載入的最終產品是位於堆區中的Class對象,Class對象封裝了類在方法區內的數據結構,並且向Java程序員提供了訪問方法區內的數據結構的介面。
類載入器是Java語言的一個創新,也是Java語言流行的重要原因之一。它使得Java類可以被動態載入到Java虛擬機中並執行。類載入器從JDK1.0就出現了,最初是為了滿足JavaApplet的需要而開發出來的。JavaApplet需要從遠程下載Java類文件到瀏覽器中並執行。現在類載入器在Web容器和OSGi中得到了廣泛的使用,而類載入器並不需要等到某個類被「首次主動使用」時再載入它,JVM規范允許類載入器在預料某個類將要被使用時就預先載入它,如果在預先載入的過程中遇到了.class文件缺失或存在錯誤,類載入器必須在程序首次主動使用該類時才報告錯誤(LinkageError錯誤)如果這個類一直沒有被程序主動使用,那麼類載入器就不會報告錯誤。
2,類的生命周期
類載入的過程中包括有載入,驗證,准備,解析,初始化五個階段。而需要注意的是在這五個階段中,載入、驗證、准備和初始化這四個階段發生的順序是確定的,而解析階段則不一定,它在某些情況下可以在初始化階段之後開始,這是為了支持Java語言的運行時綁定(也成為動態綁定或晚期綁定)。另外注意這里的幾個階段是按順序開始,而不是按順序進行或完成,因為這些階段通常都是互相交叉地混合進行的,通常在一個階段執行的過程中調用或激活另一個階段。
載入:查找並載入類的二進制數據
載入時類載入過程的第一個階段,在載入階段,虛擬機需要完成以下三件事情:
1、通過一個類的全限定名來獲取其定義的二進制位元組流。(並沒有指明要從一個Class文件中獲取,可以從其他渠道,譬如:網路、動態生成、資料庫等)
2、將這個位元組流所代表的靜態存儲結構轉化為方法區的運行時數據結構。
3、在Java堆中生成一個代表這個類的java.lang.Class對象,作為對方法區中這些數據的訪問入口。
相對於類載入的其他階段而言,載入階段(准確地說,是載入階段獲取類的二進制位元組流的動作)是可控性最強的階段,電腦培訓http://www.kmbdqn.cn/發現因為開發人員既可以使用系統提供的類載入器來完成載入,也可以自定義自己的類載入器來完成載入。