成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

熱點推薦:Java類加載器深入理解

開發 后端
本篇文章主要是詳細寫一下個人對Java ClassLoader的理解。

首先回顧一下,java虛擬機載入java類的步驟:java文件經過編譯器編譯后變成字節碼文件(.class文件),類加載器 (ClassLoader)讀取.class文件,并且轉換成java.lang.Class的一個實例,***通過newInstance方法創建該類的 一個對象。ClassLoader的作用就是根據一個類名,找到對應的字節碼,根據這些字節碼定義出對應的類,該類就是java.lang.Class的 一個實例。

類加載器的組織結構

java有三個初始類加載器,當java虛擬機啟動時,它們會按照以下順序啟動:Bootstrap classloader -> extension classloader -> system classloader。三者的關系:bootstrap classloader是extension classloader的parent,extension classloader是system classloader的parent。

bootstrap classloader

它是最原始的類加載器,并不是由java代碼寫的,是由原生代碼編寫的。Java有一次編譯、所有平臺運行的效果,就是因為它寫了一份功能相同,但針對不同平臺不同語言實現的底層代碼。它負責加載java核心庫,大家可運行以下代碼,看看自己本地的java核心庫在哪里:

  1. URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs(); 
  2. for (int i = 0; i < urls.length; i++) { 
  3. System.out.println(urls[i].toExternalForm()); 

本人的運行結果:

  1. file:/home/eric/jdk1.6.0_35/jre/lib/resources.jar 
  2. file:/home/eric/jdk1.6.0_35/jre/lib/rt.jar 
  3. file:/home/eric/jdk1.6.0_35/jre/lib/sunrsasign.jar 
  4. file:/home/eric/jdk1.6.0_35/jre/lib/jsse.jar 
  5. file:/home/eric/jdk1.6.0_35/jre/lib/jce.jar 
  6. file:/home/eric/jdk1.6.0_35/jre/lib/charsets.jar 
  7. file:/home/eric/jdk1.6.0_35/jre/lib/modules/jdk.boot.jar 
  8. file:/home/eric/jdk1.6.0_35/jre/classes 

extension classloader

它用來加載JRE的擴展目錄(JAVA_HOME/jre/lib/ext或java.ext.dirs系統屬性指定的)JAR的類包。注意,因為它是bootstrap classloader加載的,所以當你運行:

ClassLoader extensionClassloader=ClassLoader.getSystemClassLoader().getParent();
System.out.println("the parent of extension classloader : "+extensionClassloader.getParent());

輸出的是:the parent of extension classloader : null

system classloader

它用于加載classpath目錄下的jar包,我們寫的java類,一般都是由它加載,除非你自己制定個人的類加載器。

全盤負責委托機制

classloader加載類時,使用全盤負責委托機制,可以分開兩部分理解:全盤負責,委托。

全盤負責機制:若類A調用了類B,則類B和類B所引入的所有jar包,都由類A的類加載器統一加載。

委托機制:類加載器在加載類A時,會優先讓父加載器加載,當父加載器加載不到,再找父父加載器,一直找到bootstrap  classloader都找不到,才自己去相關的路徑去尋找加載。以下是ClassLoader的源碼:

  1. protected synchronized Class<?> loadClass(String name, boolean resolve) 
  2. throws ClassNotFoundException 
  3.     { 
  4. // First, check if the class has already been loaded 
  5. Class c = findLoadedClass(name); 
  6. if (c == null) { 
  7.     try { 
  8.   if (parent != null) { 
  9.       //從父加載器加載 
  10.       c = parent.loadClass(name, false); 
  11.   } else { 
  12.       //從bootstrap loader加載 
  13.       c = findBootstrapClassOrNull(name); 
  14.   } 
  15.     } catch (ClassNotFoundException e) { 
  16.                 // ClassNotFoundException thrown if class not found 
  17.                 // from the non-null parent class loader 
  18.             } 
  19.             if (c == null) { 
  20.         // If still not found, then invoke findClass in order 
  21.         // to find the class. 
  22.         c = findClass(name); 
  23.     } 
  24. if (resolve) { 
  25.     resolveClass(c); 
  26. return c; 
  27.     } 

舉個例子,類加載器加載類A的過程:

1,判斷是否已經加載過,在cache里面查找,若有,跳7;否則下一步

2,判斷當前加載器是否有父加載器,若無,則當前為ext classloader,跳去4;否則下一步

3,請求父加載器加載該類,若加載成功,跳7;若不成功,即父加載器不能找到該類,跳2

4,請求jvm的bootstrap classloader加載,若加載成功,跳7;若失敗,跳5

5,當前加載器自己加載,若成功,跳7;否則,跳6

6,拋出ClassNotFoundException

7,返回Class

編寫自己的類加載器

Java加載類的過程,實質上是調用loadClass()方法,loadClass中調用findLoadedClass()方法來檢查該類是否 已經被加載過,如果沒有就會調用父加載器的loadClass(),如果父加載器無法加載該類,就調用findClass()來查找該類。

所以我們要做的就是新建MyClassLoader繼承java.lang.ClassLoader,重寫其中的findClass()方法。主要是重新設計查找字節碼文件的方案,然后調用definedClass來返回。

本人寫了一個demo,用自己的類加載器去加載指定java文件,且帶有熱部署效果,具體請查看以下url。

Demo地址:http://git.oschina.net/ericquan8/hot-deploy

 

責任編輯:王雪燕 來源: ericquan8
相關推薦

2021-09-24 08:10:40

Java 語言 Java 基礎

2025-06-05 05:51:33

2022-10-12 07:53:46

并發編程同步工具

2010-06-01 15:25:27

JavaCLASSPATH

2016-12-08 15:36:59

HashMap數據結構hash函數

2020-07-21 08:26:08

SpringSecurity過濾器

2011-02-25 09:23:00

Java類加載器

2020-09-23 10:00:26

Redis數據庫命令

2019-06-25 10:32:19

UDP編程通信

2017-01-10 08:48:21

2024-02-21 21:14:20

編程語言開發Golang

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2017-08-15 13:05:58

Serverless架構開發運維

2023-10-19 11:12:15

Netty代碼

2021-02-17 11:25:33

前端JavaScriptthis

2009-09-25 09:14:35

Hibernate日志

2013-09-22 14:57:19

AtWood

2023-09-19 22:47:39

Java內存

2009-06-19 14:10:42

Java多態性

2021-07-22 09:55:28

瀏覽器前端緩存
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产精品99久久久久久久久 | 人人鲁人人莫人人爱精品 | 欧美男人天堂 | 精品久久久久久红码专区 | 久久这里只有精品首页 | 亚洲综合日韩精品欧美综合区 | 国产乱码久久久久久 | 黄网在线观看 | 日韩中文字幕在线免费 | 欧美日韩高清一区二区三区 | 午夜国产一级 | 国产亚洲精品91 | 一区2区| 粉嫩高清一区二区三区 | 亚洲理论在线观看电影 | 国产一区二区视频免费在线观看 | 欧美又大粗又爽又黄大片视频 | 6996成人影院网在线播放 | 成人精品一区二区 | 亚洲精品视频在线观看免费 | 精品国产一区探花在线观看 | 国产精品视屏 | 日韩精品一区二区三区老鸭窝 | 欧美日韩精品一区二区三区视频 | 亚洲欧美一区二区三区国产精品 | 7777精品伊人久久精品影视 | 综合色站导航 | 国产精品国产成人国产三级 | 国产高清免费 | 中文字幕日韩欧美一区二区三区 | 国产一区二区 | 久久久久国产一级毛片高清网站 | 日本久久网站 | 日韩午夜一区二区三区 | av在线一区二区三区 | 九九久久国产精品 | 久久精品色欧美aⅴ一区二区 | 色在线免费视频 | 一区二区国产在线观看 | 亚洲精品无 | 日本天堂视频在线观看 |