ClassLoader源码阅读
发布人:shili8
发布时间:2024-12-26 17:54
阅读次数:0
**ClassLoader 源码阅读**
ClassLoader 是 Java 中一个非常重要的类,它负责加载类文件到 JVM 中。下面我们将深入分析 ClassLoader 的源码。
###1. 类定义
javapublic class ClassLoader { // ... }
###2. 构造函数
javapublic ClassLoader() { this(null, false); } protected ClassLoader(ClassLoader parent) { this(parent, true); } protected ClassLoader(ClassLoader parent, boolean preserveNativeLoaders) { if (parent == null) throw new NullPointerException("No parent loader"); // ... }
构造函数有三个版本,分别用于不同的场景。第一个版本是无参构造函数,直接调用第二个版本的构造函数。第二个版本的构造函数接受一个父类加载器作为参数,第三个版本的构造函数除了接受父类加载器外,还有一个 boolean 参数 `preserveNativeLoaders`。
###3. loadClass 方法
javaprotected Class> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // First, look in both parent classes' loaders if either of them is this loader. ClassLoader parent = getParent(); if (parent != null && parent == this) { parent = null; } if (parent != null) { Class> c = parent.loadClass(name, false); return c; } // If still not found, then invoke findLoadedClass in both parent // classes. if (findLoadedClass(name) != null) { return null; } // If the caller has control over the parent class loader. This is // the last chance at custom loading. if (parent == null) { Class> c = findBootstrapClassOrNull(name); if (c != null) { return c; } } // Delegation to parent classes only possible in boot layer if (parent == null && name.startsWith("java.")) { return findBootstrapClassOrNull(name); } // If still not found, then create the class. Class> c = findClass(name); // This is the last card. If we still have not loaded the class which // should be loaded already, then this code loadClass must be called // with incorrect name and finally result in loading of bootstrap // classes for core Java API (like java.lang.Object etc.) resolveClass(c); return c; } }
`loadClass` 方法是 ClassLoader 中最重要的方法,它负责加载类文件到 JVM 中。这个方法有两个参数: `name` 和 `resolve`。`name` 是类名,`resolve` 是一个 boolean 值,表示是否解析类。
###4. findLoadedClass 方法
javaprotected Class> findLoadedClass(String name) { // ... }
`findLoadedClass` 方法用于查找已经加载的类。如果类已经被加载,则返回该类,如果没有则返回 null。
###5. findBootstrapClassOrNull 方法
javaprivate Class> findBootstrapClassOrNull(String name) { // ... }
`findBootstrapClassOrNull` 方法用于查找引导类。如果类存在,则返回该类,如果不存在则返回 null。
###6. findClass 方法
javaprotected Class> findClass(String name) throws ClassNotFoundException { // ... }
`findClass` 方法用于查找类文件。如果类文件存在,则返回该类,如果不存在则抛出 `ClassNotFoundException` 异常。
###7. resolveClass 方法
javaprotected void resolveClass(Class> c) { // ... }
`resolveClass` 方法用于解析类。这个方法会将类的字节码转换为 JVM 可以理解的形式。
以上就是 ClassLoader 源码阅读的主要内容。通过分析这些源码,我们可以更深入地了解 Java 的类加载机制。