一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java基礎學習筆記之類加載器

java基礎學習筆記之類加載器

2020-03-28 11:27hebedich JAVA教程

java中的類加載器:java虛擬機中可以安裝多個類加載器,系統默認三個主要類加載器,每個類負責加載特定位置的類:BootStrap, ExtClassLoader,AppClassLoader類加載器也是一個java類,因此類加載器也需要被加載,所以必須有第一個類加載器

類加載器

java類加載器就是在運行時在JVM中動態地加載所需的類,java類加載器基于三個機制:委托,可見,單一。

把classpath下的那些.class文件加載進內存,處理后成為字節碼,這些工作是類加載器做的。

  1. 委托機制指的是將加載類的請求傳遞給父加載器,如果父加載器找不到或者不能加載這個類,那么再加載他。
  2. 可見性機制指的是父加載器加載的類都能被子加載器看見,但是子加載器加載的類父加載器是看不見的。
  3. 單一性機制指的是一個類只能被同一種加載器加載一次。

默認類加載器

系統默認三個類加載器:

  1. BootStrap
  2. ExtClassLoader
  3. AppClassLoader

類加載器也是java類,而BootStrap不是。 驗證代碼:

?
1
2
3
4
5
public class ClassLoaderTest {
  public static void main(String[] args) {
    System.out.println(System.class.getClassLoader());
  }
}

輸出:null

如果使用System.out.println(System.class.getClassLoader().toString);,則報空指針異常:

?
1
2
3
4
5
6
7
Exception in thread "main" java.lang.NullPointerException
  at com.iot.classloader.ClassLoaderTest.main(ClassLoaderTest.java:10)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:483)
  at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

可見,System類是由BootStrap類加載器加載。

類加載器的委托機制

類加載器的樹狀圖

類加載器

一般加載類的順序:

  1. 首先當前線程的類加載器去加載線程中的第一個類
  2. 如果類A應用了類B,java虛擬機將使用加載類A的類加載器來加載類B
  3. 還可以直接調用ClassLoader.loadClass()方法來制定某個類加載器去加載某個類

自定義類加載器的編寫原理

API:

Class ClassLoader

模板方法設計模式

父類:

loadClass(類加載的流程,模板)
findClass供子類覆蓋的、被loadClass方法調用的類加載邏輯
defineClass得到class文件轉換成字節碼

子類:覆蓋findClass方法

例子:

loadClass方法的源碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
protected Class<?> loadClass(String name, boolean resolve)
  throws ClassNotFoundException
{
  synchronized (getClassLoadingLock(name)) {
    // First, check if the class has already been loaded
    Class<?> c = findLoadedClass(name);
    if (c == null) {
      long t0 = System.nanoTime();
      try {
        if (parent != null) {
          c = parent.loadClass(name, false);
        } else {
          c = findBootstrapClassOrNull(name);
        }
      } catch (ClassNotFoundException e) {
        // ClassNotFoundException thrown if class not found
        // from the non-null parent class loader
      }
 
      if (c == null) {
        // If still not found, then invoke findClass in order
        // to find the class.
        long t1 = System.nanoTime();
        c = findClass(name);
 
        // this is the defining class loader; record the stats
        sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
        sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
        sun.misc.PerfCounter.getFindClasses().increment();
      }
    }
    if (resolve) {
      resolveClass(c);
    }
    return c;
  }
}

API文檔中的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class NetworkClassLoader extends ClassLoader {
   String host;
   int port;
 
   public Class findClass(String name) {
     byte[] b = loadClassData(name);
     return defineClass(name, b, 0, b.length);
   }
 
   private byte[] loadClassData(String name) {
     // load the class data from the connection
     . . .
   }
 }

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费国产高清视频 | ts人妖系列在线专区 | 车上小婕子系列辣文小说 | 草草视频在线免费观看 | 日韩伦理一区 | 热99re久久精品精品免费 | 国产自在自线午夜精品之la | www.男人的天堂.com | 欧美日韩亚洲另类人人澡 | 成年看片免费高清观看 | 国产自拍视频一区 | 国语刺激对白勾搭视频在线观看 | 热99re国产久热在线 | 国产女乱淫真高清免费视频 | 奇米777狠狠| 亚欧有色在线观看免费版高清 | 欧美ⅹxxxx视频 | 国产九九在线 | 免费视频一区 | 国产精品污双胞胎在线观看 | 色综合精品 | 美女被到爽流动漫 | 黄篇网站在线观看 | 华人亚洲欧美精品国产 | 日韩大片在线播放 | 亚洲无线一二三区2021 | x8x8在线观看免费 | 91天堂素人97年清纯嫩模 | 九九九九九热 | 男生操女生漫画 | 国产精品久久一区 | 亚洲国产三级在线观看 | 狠狠色综合久久婷婷色天使 | 午夜理伦片免费 | 男人j进女屁股视频在线观看 | 草莓视频旧版 | 翁熄性放纵交换01 | 国产精品福利在线观看秒播 | 乖女的嫩奶水h文孕妇 | 96免费精品视频在线 | 变态人shou交小说 |