返回
剖析类加载过程中的 Category 加载
IOS
2023-11-27 12:16:00
四、关于 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
方法加载所有的类加载器。