當前位置:首頁 » 編程語言 » java類載入器

java類載入器

發布時間: 2022-05-26 03:43:09

java:如何編寫自己的Java類載入器

給你簡單介紹一下類載入器

1.類載入器就載入位元組碼文件(.class)

public class FileClassLoader extends ClassLoader {String rootDir=null;public FileClassLoader(String rootDir) {this.rootDir = rootDir;}@Overrideprotected Class<?> findClass(String className) throws ClassNotFoundException {//首先檢查是否已經被載入了。Class<?> c = findLoadedClass(className);String path = rootDir + "/" + className.replace('.', '/') + ".class";if (c != null) {return c;} else {/*雙親委託模式*/ClassLoader loaderParent = this.getParent();c = loaderParent.loadClass(className);if (c != null) {return c;} else {/*如果再不行的話,就再進行載入。因為位元組碼的本質就是一個位元組數組*/InputStream is = null;ByteArrayOutputStream outputStream = new ByteArrayOutputStream();try {is = new FileInputStream(path);byte[] buffer = new byte[1024];int len = 0;while ((len = is.read(buffer)) != -1) {outputStream.write(buffer, 0, len);}c = defineClass(className, buffer, 0, buffer.length);}catch (Exception e) {e.printStackTrace();}finally {if (is != null) {try {is.close();}catch (IOException e) {e.printStackTrace();}}}}return c;}}

}

/*

相同的類載入器對同一個類進行載入,得到的hascode是相同的

* 不同的類載入器對同一類進行載入,得到的hascode是不一樣的*/public class Demo {public static void main(String[] args) {FileClassLoader loader = new FileClassLoader("c://myjava");FileClassLoader loader2=new FileClassLoader("c://myjava");try {Class<?> c = loader.findClass("com.lg.test.HelloWorld");Class<?> c0=loader.findClass("com.lg.test.HelloWorld");Class<?> c1=loader2.findClass("com.lg.test.HelloWorld");Class<?> c2=loader.findClass("com.lg.test.Demo01");Class<?> c3=loader.findClass("java.lang.String");System.out.println(c.hashCode());System.out.println(c.getClassLoader());System.out.println(c0.hashCode());System.out.println(c0.getClassLoader());System.out.println(c1.hashCode());System.out.println(c1.getClassLoader());System.out.println(c2.hashCode());System.out.println(c2.getClassLoader());System.out.println(c3.hashCode());System.out.println(c3.getClassLoader());}catch (ClassNotFoundException e) {e.printStackTrace();}}}

⑵ 描述一下JVM載入class文件的原理

Java語言是一種具有動態性的解釋型語言,類(class)只有被載入到JVM中後才能運行。當運行指定程序時,JVM會將編譯生成的.class文件按照需求和一定的規則載入到內存中,並組織成為一個完整的Java應用程序。這個載入過程是由類載入器來完成的,具體來說,就是由ClassLoader和它的子類來實現的。類載入器本身也是一個類,其實質是把類文件從硬碟讀取到內存中。
類的載入方式分為隱式載入與顯式載入兩種。隱式載入指的是程序在使用new等方法創建對象時,會隱式地調用類的載入器把對應的類載入到JVM中。顯式載入指的是通過直接調用class.forName()方法來把所需要的類載入到JVM中。
任何一個工程項目都是由許多個類組成的,當程序啟動時,只把需要載入的類載入到JVM中,其他類只有被使用到的時候才會被載入,採用這種方法,一方面可以加快載入速度,另外一方面可以節約程序運行過程中對內存的開銷。此外,在Java語言中,每個類或介面都對應一個.class文件,這些文件可以被看成一個個可以被動態載入的單元,因此當只有部分類被修改時,只需要重新編譯變化的類即可,而不需要重新編譯所有文件,因此加快了編譯速度。

⑶ Java 類載入器怎麼實現將同一個對象載入兩次

類A中有一個欄位a,它的類型為X
類B中有一個欄位b,它的類型也為X
類A由classLoaderA所載入,類B由classLoaderB所載入
執行賦值語句A.a
=
B.b,由於這兩個類型均為X,可以執行,但是有一個要求,這個要求就是在A中所裝載類X的裝載器必須和在B中裝載類X的裝載器相同,否則賦值語句失敗!

⑷ java的類載入器有哪些,它們的順序是什麼

類載入器有四種,分別是 bootstrapClassLoader (主要載入java核心api) , ExtClassLoaders是擴展類的類載入器,AppClassLoader 程序類載入器,還有一個是用戶繼承ClassLoader重寫的類載入器。

⑸ java中類載入器是怎麼工作的

JVM將類載入過程分為三個步驟:裝載(Load),鏈接(Link)和初始化(Initialize)
鏈接又分為三個步驟,驗證、准備、解析
1) 裝載:查找並載入類的二進制數據;
2)鏈接:
驗證:確保被載入類的正確性;
准備:為類的靜態變數分配內存,並將其初始化為默認值;
解析:把類中的符號引用轉換為直接引用;
3)初始化:為類的靜態變數賦予正確的初始值;
那為什麼我要有驗證這一步驟呢?首先如果由編譯器生成的class文件,它肯定是符合JVM位元組碼格式的,但是萬一有高手自己寫一個class文件,讓JVM載入並運行,用於惡意用途,就不妙了,因此這個class文件要先過驗證這一關,不符合的話不會讓它繼續執行的,也是為了安全考慮吧。
准備階段和初始化階段看似有點牟盾,其實是不牟盾的,如果類中有語句:private static int a = 10,它的執行過程是這樣的,首先位元組碼文件被載入到內存後,先進行鏈接的驗證這一步驟,驗證通過後准備階段,給a分配內存,因為變數a是static的,所以此時a等於int類型的默認初始值0,即a=0,然後到解析(後面在說),到初始化這一步驟時,才把a的真正的值10賦給a,此時

⑹ 在java中,什麼是類載入器子系統

java中的類要載入到jvm中才能使用,那麼把java類載入到jvm中的工具,就是類載入器。
java內置3種類載入器,BootstrapClassLoader,ExtClassLoader,SystemClassLoader(可能名字不對),第一個是載入jvm啟動時需要的類和一些基本java類庫,它不是java寫的;另外兩個都是java寫的,用來載入其它java類。
用戶自己寫的類一般用SystemClassLoader載入,因為它的載入路徑是classpath,可以自己設定,一般都會把項目路徑設進去

⑺ java類載入器有幾種

Java中載入器的種類大致可以分為四種:Bootstrap ClassLoader(由C++語言寫成),系統載入器(也就是內部類AppClassLoader),ExtClassLoader,以及java.net.UrlClassLoader.
當我們運行一個程序時,首先是找到JDK安裝目下的jvm.dll來啟動JAVA虛擬機,而後Bootstrap ClassLoader產生,接下來就是Bootstrap ClassLoader來載入ExtClassLoader,並且指定ExtClassLoader的父載入器為Bootstrap ClassLoader,但是因為Bootstrap ClassLoader用C++語言寫的,所以用JAVA的觀點來看,這個載入器的實例是不存在的,所以ExtClassLoader的父載入器被設置為了null,然後就是Bootstrap ClassLoader將AppClassLoader裝載,並指定其父載入器為ExtClassLoader。
JAVA是按照載入器的委派模型來實現的。這種模型是JAVA安全性機制的保證。並且值得我們注意的就是這幾個載入器的默認載入類的路徑。對於AppCLassLoder來說,它的路徑也就是我們的classpath裡面的路徑。而對於ExtClassLoader來說,它的路徑是jre\lib\ext\classes.對於URLClassLoader來說,它的載入路徑是我們指定的url。

⑻ Java的ServiceLoader有多個類載入器

JVM有三種類載入器:bootstrap負責載入系統類,extclassloader負責載入擴展類,appclassloader負責載入應用類。他們主要是分工不一樣,各自負責不同的區域,另外也是為了實現委託模型。什麼是委託模型呢,其實就是當類載入器有載入需求的時候,先請示他的父類使用父類的搜索路徑來加入,如果沒有找到的話,才使用自己的搜索路徑來來搜索類。
當執行 java ***.class 的時候, java.exe 會幫助我們找到 JRE ,接著找到位於 JRE 內部的 jvm.dll ,這才是真正的 Java 虛擬機器 , 最後載入動態庫,激活 Java 虛擬機器。虛擬機器激活以後,會先做一些初始化的動作,比如說讀取系統參數等。一旦初始化動作完成之後,就會產生第一個類載入器―― Bootstrap Loader , Bootstrap Loader 是由 C++ 所撰寫而成,這個 Bootstrap Loader 所做的初始工作中,除了一些基本的初始化動作之外,最重要的就是載入 Launcher.java 之中的 ExtClassLoader ,並設定其 Parent 為 null ,代表其父載入器為 BootstrapLoader 。然後 Bootstrap Loader 再要求載入 Launcher.java 之中的 AppClassLoader ,並設定其 Parent 為之前產生的 ExtClassLoader 實體。這兩個載入器都是以靜態類的形式存在的。這里要請大家注意的是, Launcher$ExtClassLoader.class 與 Launcher$AppClassLoader.class 都是由 Bootstrap Loader 所載入,所以 Parent 和由哪個類載入器載入沒有關系。
下面的圖形可以表示三者之間的關系:
BootstrapLoader <---(Extends)----AppClassLoader <---(Extends)----ExtClassLoader
這三個載入器就構成我們的 Java 類載入體系。他們分別從以下的路徑尋找程序所需要的類:
BootstrapLoader : sun.boot.class.path
ExtClassLoader: java.ext.dirs
AppClassLoader: java.class.path
這三個系統參量可以通過 System.getProperty() 函數得到具體對應的路徑。大家可以自己編程實現查看具體的路徑。

⑼ Java面試題, 類載入器,載入順序的問題,不太懂結果為什麼是這樣 結果是1,0

類載入時,按順序執行靜態成員變數初始化。
最先初始化 singleton = new Singleton(); 構造方法中 counter1++ 後 counter1 為 1,counter2++ 後 counter2 為1。
然後初始化 counter2 = 0,counter2 從 1 變成 0。
注意,public static int counter1 這是變數聲明,不會像 counter2 = 0 這樣在初始化階段設成 0 。

⑽ java中反射、類載入器、動態代理之間的關系

你最好把結合框架 i/o復習好 還有多線程 線程池和反射 復習好 內載入器和代理 就問一下定義 老師給的現場筆試都是i/o 和集合框架
反射是Java的最重要的底層知識。而動態代理其實質就是依靠反射來實現的。

反射是通過位元組碼文件對象,將類的欄位,方法,構造器等映射成相應的類,並進行各自的操作;
類載入器是通過某個類的.classLoader()方法,將該類的.class文件從硬碟中載入到java虛擬機中,形成位元組碼文件;
動態代理是為了實現目標類的功能,並添加特有的系統功能,傳入類載入器,目標類的介面,以及InvocationHandler介面的實現子類,
(InvocationHandler介面的invoke()方法,要傳入代理對象,方法名,方法的參數,在invoke方法中,可以添加特有的系統功能)
然後就可以根據運行時,目標類的不同,以及要實現系統功能的不同,動態生成代理類,來完成相應的功能類的創建;

熱點內容
java的job 發布:2025-02-12 23:38:43 瀏覽:892
我的世界伺服器授權指令 發布:2025-02-12 23:30:13 瀏覽:596
電腦伺服器號在哪裡找 發布:2025-02-12 23:22:29 瀏覽:12
linux查看系統是32位 發布:2025-02-12 23:17:29 瀏覽:989
從資料庫中隨機取資料庫數據 發布:2025-02-12 23:17:25 瀏覽:878
ftp下載軟體安卓 發布:2025-02-12 23:07:24 瀏覽:567
c搜索演算法 發布:2025-02-12 23:05:47 瀏覽:862
返回伺服器地址 發布:2025-02-12 23:05:45 瀏覽:181
我的世界推薦在線伺服器 發布:2025-02-12 23:00:18 瀏覽:462
什麼是解壓目錄 發布:2025-02-12 22:49:24 瀏覽:981