返回

剖析类加载过程中的 Category 加载

IOS

四、关于 Category
Category 是 Java 类加载器的一种,它负责加载和管理类。Category 类加载器的结构如下:

public abstract class Category extends LinkageValue {
  private Class<?> categoryType;
  private Category table[];
  private static final Category loaders[] = new Category[101];
}

Category 类加载器的主要成员变量如下:

  • categoryType:表示该类加载器加载的类的类型。
  • table:表示该类加载器加载的类的表。
  • loaders:表示所有类加载器的表。

4.1、Category 的数据结构

Category 类加载器的表结构如下:

private Category table[];

table 数组是一个哈希表,它使用类名作为键,将类加载器存储在哈希表中。

4.2、attachToClass

attachToClass 方法将类加载器附加到类中。

public void attachToClass(Class<?> c) {
  attachToCategory(c.getName());
}

attachToClass 方法首先调用 attachToCategory 方法将类加载器附加到类的名字上,然后将类加载器添加到类的表中。

4.3、load_images

load_images 方法加载类的映像。

public static NativeLibrary load_images(String file, String directory, long mask, ClassLoader loader) {
  if (file == null) {
    return null;
  }
  NativeLibrary result = load(file, mask, loader);
  if (result != null) {
    if (directory != null && (mask & RTLD_LOCAL) == 0) {
      result.setOrigin(new File(directory, file).getPath());
    }
    return result;
  }
  return null;
}

load_images 方法首先检查文件是否为 null,如果为 null,则返回 null。然后,调用 load 方法加载类的映像。如果加载成功,则将类的映像添加到类的表中。

4.4、AttachCategory

AttachCategory 方法将类加载器附加到类中。

public static void attachCategory(String name) {
  ClassLoader loader = Thread.currentThread().getContextClassLoader();
  attachCategory(name, loader);
}

AttachCategory 方法首先获取当前线程的类加载器,然后调用 attachCategory 方法将类加载器附加到类的名字上。

1、loadAllCategories

loadAllCategories 方法加载所有的类加载器。

public static void loadAllCategories() {
  for (int i = 0; i < loaders.length; i++) {
    if (loaders[i] != null) {
      loaders[i].loadAllCategories();
    }
  }
}

loadAllCategories 方法首先遍历所有类加载器,然后调用 loadAllCategories 方法加载所有的类加载器。