国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|

服務器之家 - 編程語言 - JAVA教程 - java 詳解類加載器的雙親委派及打破雙親委派

java 詳解類加載器的雙親委派及打破雙親委派

2020-07-26 14:08java教程網 JAVA教程

這篇文章主要介紹了java 詳解類加載器的雙親委派及打破雙親委派的相關資料,需要的朋友可以參考下

java 詳解類加載器的雙親委派及打破雙親委派

一般的場景中使用Java默認的類加載器即可,但有時為了達到某種目的又不得不實現自己的類加載器,例如為了達到類庫的互相隔離,例如為了達到熱部署重加載功能。這時就需要自己定義類加載器,每個類加載器加載各自的類庫資源,以此達到資源隔離效果。在對資源的加載上可以沿用雙親委派機制,也可以打破雙親委派機制。

一、沿用雙親委派機制自定義類加載器很簡單,只需繼承ClassLoader類并重寫findClass方法即可。如下例子:

①先定義一個待加載的類Test,它很簡單,只是在構建函數中輸出由哪個類加載器加載。

?
1
2
3
4
5
6
7
public class Test {
 
  public Test(){
    System.out.println(this.getClass().getClassLoader().toString());
  }
 
}

②定義一個TestClassLoader類繼承ClassLoader,重寫findClass方法,此方法要做的事情是讀取Test.class字節流并傳入父類的defineClass方法即可。然后就可以通過自定義累加載器TestClassLoader對Test.class進行加載,完成加載后會輸出“TestLoader”。

?
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class TestClassLoader extends ClassLoader {
 
  private String name;
 
  public TestClassLoader(ClassLoader parent, String name) {
    super(parent);
    this.name = name;
  }
 
  @Override
  public String toString() {
    return this.name;
  }
 
  @Override
  public Class<?> findClass(String name) {
 
    InputStream is = null;
    byte[] data = null;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
      is = new FileInputStream(new File("d:/Test.class"));
      int c = 0;
      while (-1 != (c = is.read())) {
        baos.write(c);
      }
      data = baos.toByteArray();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        is.close();
        baos.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    return this.defineClass(name, data, 0, data.length);
  }
 
  public static void main(String[] args) {
    TestClassLoader loader = new TestClassLoader(
        TestClassLoader.class.getClassLoader(), "TestLoader");
    Class clazz;
    try {
      clazz = loader.loadClass("test.classloader.Test");
      Object object = clazz.newInstance();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
 
}

二、打破雙親委派機制則不僅要繼承ClassLoader類,還要重寫loadClass和findClass方法,如下例子:

①定義Test類。

?
1
2
3
4
5
public class Test {
  public Test(){
    System.out.println(this.getClass().getClassLoader().toString());
  }
}

②重新定義一個繼承ClassLoader的TestClassLoaderN類,這個類與前面的TestClassLoader類很相似,但它除了重寫findClass方法外還重寫了loadClass方法,默認的loadClass方法是實現了雙親委派機制的邏輯,即會先讓父類加載器加載,當無法加載時才由自己加載。這里為了破壞雙親委派機制必須重寫loadClass方法,即這里先嘗試交由System類加載器加載,加載失敗才會由自己加載。它并沒有優先交給父類加載器,這就打破了雙親委派機制。

?
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public class TestClassLoaderN extends ClassLoader {
 
  private String name;
 
  public TestClassLoaderN(ClassLoader parent, String name) {
    super(parent);
    this.name = name;
  }
 
  @Override
  public String toString() {
    return this.name;
  }
 
  @Override
  public Class<?> loadClass(String name) throws ClassNotFoundException {
    Class<?> clazz = null;
    ClassLoader system = getSystemClassLoader();
    try {
      clazz = system.loadClass(name);
    } catch (Exception e) {
      // ignore
    }
    if (clazz != null)
      return clazz;
    clazz = findClass(name);
    return clazz;
  }
 
  @Override
  public Class<?> findClass(String name) {
 
    InputStream is = null;
    byte[] data = null;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
      is = new FileInputStream(new File("d:/Test.class"));
      int c = 0;
      while (-1 != (c = is.read())) {
        baos.write(c);
      }
      data = baos.toByteArray();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        is.close();
        baos.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    return this.defineClass(name, data, 0, data.length);
  }
 
  public static void main(String[] args) {
    TestClassLoaderN loader = new TestClassLoaderN(
        TestClassLoaderN.class.getClassLoader(), "TestLoaderN");
    Class clazz;
    try {
      clazz = loader.loadClass("test.classloader.Test");
      Object object = clazz.newInstance();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
 
}

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲九区 | 亚洲国产成人一区二区精品区 | 奇米成人 | 一区二区在线影院 | 影音先锋中文字幕一区 | 日本三级不卡 | 亚洲一区二区视频在线观看 | 日本一区二区免费视频 | 一区二区三区久久 | 在线二区 | 免费观看一级毛片 | 欧美一区二区小视频 | 91免费在线播放 | 国产亚洲精品久久久闺蜜 | 午夜精品久久久久久久久 | 91麻豆精品国产91久久久久久久久 | 久久人体视频 | 欧美综合一区二区三区 | 国产麻豆一区二区三区四区 | 中文字幕视频播放 | 91精品久久久久久久久久久 | 亚洲精品久久 | 九九九久久国产免费 | 色成人免费网站 | 综合色吧| 国产亚洲精品久久久久久 | 久久久久久久一区 | 三区视频 | 成年人在线观看 | 欧美日韩高清在线 | 国产真实乱全部视频 | 中文字幕视频一区 | 日本一区二区精品视频 | 欧美日韩一区二区在线播放 | 久久精品二区 | 国产精品久久久av | 在线婷婷| 黄色视屏在线免费观看 | 自拍偷拍中文字幕 | 黄片毛片在线观看 | 精品久久精品 |