最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ClassLoader類加載源碼解析

 更新時間:2019年09月16日 15:32:44   作者:droidDing  
這篇文章主要為大家詳細解析了ClassLoader類加載源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Java類加載器

1、BootClassLoader: 用于加載Android Framework層class文件。
2、PathClassLoader: 用于Android應用程序類加載器。可以加載指定的dex,jar、zip、zpk中的classes.dex
3、DexClassLoader:加載指定的dex,以及jar、zip、apk中的classes.dex

源碼解析

1.ClassLoader中提供loadClass用于加載指定類

//ClassLoader.java
public Class<?> loadClass(String name) throws ClassNotFoundException {
 //該處調(diào)用了兩個參數(shù)的重載方法
  return loadClass(name, false);
 }
 
 protected Class<?> loadClass(String name, boolean resolve)
  throws ClassNotFoundException
 {
  //先查一下該類是否已經(jīng)加載過了
   Class<?> c = findLoadedClass(name);
   if (c == null) {
    try {
     //雙親委托機制,先讓爸爸去找
     if (parent != null) {
      c = parent.loadClass(name, false);
     } else {
      //如果parent為null,則用BootClassLoader進行加載
      c = findBootstrapClassOrNull(name);
     }
    } catch (ClassNotFoundException e) {
     // ClassNotFoundException thrown if class not found
     // from the non-null parent class loader
    }

    if (c == null) {
     //如果都找不到就自己去找,此方法在子類BaseDexClassLoader類中有重寫
     c = findClass(name);
    }
   }
   return c;
 }

2.BaseDexClassLoader類中對findClass有重寫,也是實際會使用執(zhí)行的

//BaseDexClassLoader.java
//查找class
 @Override
 protected Class<?> findClass(String name) throws ClassNotFoundException {
  ...
  //這里通過pathList變量來查找,而pathList是在BaseDexClassLoader的構(gòu)造方法中初始化的
  Class c = pathList.findClass(name, suppressedExceptions);
  ...
  return c;
 }
 
private final DexPathList pathList;
public BaseDexClassLoader(String dexPath, File optimizedDirectory,
   String librarySearchPath, ClassLoader parent, boolean isTrusted) {
  super(parent);
  //構(gòu)造方法中初始化pathList變量
  this.pathList = new DexPathList(this, dexPath, librarySearchPath, null, isTrusted);
 }

3.BaseDexClassLoader中是通過調(diào)用DexPathList中的findClass來實現(xiàn)的,那么接下來我們分析一下DexPathList是怎么實現(xiàn)的

//DexPathList.java
//是一個Element數(shù)組,一個element中包含一個 DexFile,DexFile就代表一個Dex文件,里面的native(C/C++)函數(shù)來進行Dex的加載工作
 private Element[] dexElements;
 
public Class<?> findClass(String name, List<Throwable> suppressed) {
  for (Element element : dexElements) {
   //此處調(diào)用Element的findClass來實現(xiàn),
   Class<?> clazz = element.findClass(name, definingContext, suppressed);
   if (clazz != null) {
    return clazz;
   }
  }
  return null;
 }
// Element為DexPathList的內(nèi)部類
static class Element {
 private final File path;
  //一個DexFile就代表一個Dex文件
  private final DexFile dexFile;
  //有多個構(gòu)造方法,但都僅是將值傳過來,讓Element來持有一個DexFile
  public Element(DexFile dexFile) {
 this.dexFile = dexFile;
   this.path = null;
 }
  
  public Class<?> findClass(String name, ClassLoader definingContext,
    List<Throwable> suppressed) {
    //通過DexFile來加載類
   return dexFile != null ? dexFile.loadClassBinaryName(name, definingContext, suppressed)
     : null;
  }
 }

DexPathList(ClassLoader definingContext, String dexPath,
   String librarySearchPath, File optimizedDirectory, boolean isTrusted) {
   //通過makeDexElements方法為dexElements初始化
 this.dexElements = makeDexElements(splitDexPath(dexPath), optimizedDirectory,
           suppressedExceptions, definingContext, isTrusted);
}
//騰訊系的熱修復,諸如微信tinker、qq空間qfix原理便是反射此方法,將修復后的類打包成dex,通過反射該方法來將文件轉(zhuǎn)化為Element,并將新生成的element放到dexElements前面,這樣下次系統(tǒng)再去尋找某個class時,會先從修復后的dex中來找class,找到后便不再繼續(xù)查找,從而修復該class,此方式便為插樁
private static Element[] makeDexElements(List<File> files, File optimizedDirectory,
   List<IOException> suppressedExceptions, ClassLoader loader, boolean isTrusted) {
  Element[] elements = new Element[files.size()];
  ...
  for (File file : files) {
 if (name.endsWith(DEX_SUFFIX)) {
    //以 .dex 結(jié)尾的
     // Raw dex file (not inside a zip/jar).
     //加載dex文件
      dex = loadDexFile(file, optimizedDirectory, loader, elements);
      if (dex != null) {
       elements[elementsPos++] = new Element(dex, null);
      }
    }
 }
   ...
  return elements;
 }

private static DexFile loadDexFile(File file, File optimizedDirectory, ClassLoader loader,
          Element[] elements)
   throws IOException {
  if (optimizedDirectory == null) {
   return new DexFile(file, loader, elements);
  } else {
   String optimizedPath = optimizedPathFor(file, optimizedDirectory);
   return DexFile.loadDex(file.getPath(), optimizedPath, 0, loader, elements);
  }
 }

4.這里通過 new DexFile 或者 loadDex方法來創(chuàng)建DexFile,兩者類似,那我們拿new DexFile 來舉例分析

//DexFile.java
private DexFile(String sourceName, String outputName, int flags, ClassLoader loader,
   DexPathList.Element[] elements) throws IOException {
  ...
  //此處調(diào)用openDexFile來實現(xiàn)
  mCookie = openDexFile(sourceName, outputName, flags, loader, elements);
  ...
 }

private static Object openDexFile(String sourceName, String outputName, int flags,
   ClassLoader loader, DexPathList.Element[] elements) throws IOException {
  //此處通過調(diào)用 openDexFileNative來實現(xiàn)
  return openDexFileNative(new File(sourceName).getAbsolutePath(),
         (outputName == null)
          ? null
          : new File(outputName).getAbsolutePath(),
         flags,
         loader,
         elements);
 }
//openDexFileNative是一個native方法,是由C/C++來實現(xiàn)的
private static native Object openDexFileNative(String sourceName, String outputName, int flags,
   ClassLoader loader, DexPathList.Element[] elements);

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實現(xiàn)文件檢索系統(tǒng)的示例代碼

    Java實現(xiàn)文件檢索系統(tǒng)的示例代碼

    這篇文章主要為大家詳細介紹了如何劉Java語言實現(xiàn)簡易的文件檢索系統(tǒng),文中的示例代碼講解詳細,對我們學習Java開發(fā)有一定的幫助,需要的可以參考一下
    2022-07-07
  • 詳解Java異常處理最佳實踐及陷阱防范

    詳解Java異常處理最佳實踐及陷阱防范

    這篇文章主要介紹了Java異常處理最佳實踐及陷阱防范,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Apache Commons Math3探索之多項式曲線擬合實現(xiàn)代碼

    Apache Commons Math3探索之多項式曲線擬合實現(xiàn)代碼

    這篇文章主要介紹了Apache Commons Math3探索之多項式曲線擬合實現(xiàn)代碼,小編覺得挺不錯的,這里分享給大家,供需要的朋友參考。
    2017-10-10
  • Springboot設(shè)置默認訪問路徑方法實現(xiàn)

    Springboot設(shè)置默認訪問路徑方法實現(xiàn)

    這篇文章主要介紹了Springboot設(shè)置默認訪問路徑方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 關(guān)于BufferedReader讀取文件指定字符集問題

    關(guān)于BufferedReader讀取文件指定字符集問題

    這篇文章主要介紹了關(guān)于BufferedReader讀取文件指定字符集問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 解決SpringBoot application.yaml文件配置schema 無法執(zhí)行sql問題

    解決SpringBoot application.yaml文件配置schema 無法執(zhí)行sql問題

    這篇文章主要介紹了解決SpringBoot application.yaml文件配置schema 無法執(zhí)行sql問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 全面分析Java方法的使用與遞歸

    全面分析Java方法的使用與遞歸

    在java中,方法就是用來完成解決某件事情或?qū)崿F(xiàn)某個功能的辦法;程序調(diào)用自身的編程技巧稱為遞歸( recursion)。遞歸做為一種算法在程序設(shè)計語言中廣泛應用。但是如果沒終止條件會造成死循環(huán),所以遞歸代碼里要有結(jié)束自調(diào)自的條件,本篇接下來講解一下方法與遞歸
    2022-04-04
  • 基于String變量的兩種創(chuàng)建方式(詳解)

    基于String變量的兩種創(chuàng)建方式(詳解)

    下面小編就為大家?guī)硪黄赟tring變量的兩種創(chuàng)建方式(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 解決Java項目啟動報錯:Logback?configuration?error?detected:問題

    解決Java項目啟動報錯:Logback?configuration?error?detected:問題

    這篇文章主要介紹了解決Java項目啟動報錯:Logback?configuration?error?detected:問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • java中實現(xiàn)excel合并單元格詳細代碼實例

    java中實現(xiàn)excel合并單元格詳細代碼實例

    最近的工作中,遇到一個需求在生成的Excel表格后需要在尾部添加一個合并的單元格數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于java中實現(xiàn)excel合并單元格的相關(guān)資料,需要的朋友可以參考下
    2024-06-06

最新評論

阳曲县| 东兴市| 徐闻县| 庆阳市| 马边| 瑞丽市| 乌兰县| 永寿县| 庆阳市| 闸北区| 彝良县| 宿州市| 桐梓县| 梧州市| 玉田县| 兰考县| 扶风县| 岳阳市| 宜兰县| 南乐县| 青川县| 尼玛县| 黔西县| 南充市| 甘南县| 双城市| 麻栗坡县| 溧阳市| 东乌珠穆沁旗| 桂林市| 谢通门县| 吉木乃县| 临沭县| 密云县| 六盘水市| 珠海市| 漳州市| 辽宁省| 青州市| 商都县| 营山县|