当前位置:实例文章 » 其他实例» [文章]ClassLoader源码阅读

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 的类加载机制。

相关标签:ssl源码
其他信息

其他资源

Top