[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/enjoytoshare/JavaGuide/main/docs/java/jvm/classloader.md [Back]  [Original]

---
category: Java
tag:
  - JVM
---

# 

## 

**->->****->->**

![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/.png)

 `loadClass()`  Java 

 `.class`

## 

JVM  ClassLoader BootstrapClassLoader  Java `java.lang.ClassLoader`

1.  **BootstrapClassLoader()**  C++ `%JAVA_HOME%/lib` jar  `-Xbootclasspath`
2.  **ExtensionClassLoader()**  `%JRE_HOME%/lib/ext`  jar  `java.ext.dirs`  jar 
3.  **AppClassLoader()**  classpath  jar 

## 

### 

 ClassLoader  ****  `loadClass()`  `BootstrapClassLoader`  null  `BootstrapClassLoader` 

![ClassLoader](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/classloader_WPS.png)



```java
public class ClassLoaderDemo {
    public static void main(String[] args) {
        System.out.println("ClassLodarDemo's ClassLoader is " + ClassLoaderDemo.class.getClassLoader());
        System.out.println("The Parent of ClassLodarDemo's ClassLoader is " + ClassLoaderDemo.class.getClassLoader().getParent());
        System.out.println("The GrandParent of ClassLodarDemo's ClassLoader is " + ClassLoaderDemo.class.getClassLoader().getParent().getParent());
    }
}
```

Output

```
ClassLodarDemo's ClassLoader is sun.misc.Launcher$AppClassLoader@18b4aac2
The Parent of ClassLodarDemo's ClassLoader is sun.misc.Launcher$ExtClassLoader@1b6d3586
The GrandParent of ClassLodarDemo's ClassLoader is null
```

`AppClassLoader``ExtClassLoader`
`ExtClassLoader` null**null `ExtClassLoader` `BootstrapClassLoader`** 

 Mother ClassLoader  Father ClassLoader  API :

> The Java platform uses a delegation model for loading classes. **The basic idea is that every class loader has a "parent" class loader.** When loading a class, a class loader first "delegates" the search for the class to its parent class loader before attempting to find the class itself.

### 

 `java.lang.ClassLoader`  `loadClass()` 

```java
private final ClassLoader parent;
protected Class loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // 
            Class c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {//loadClass()
                        c = parent.loadClass(name, false);
                    } else {// BootstrapClassLoader 
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                   //
                }

                if (c == null) {
                    long t1 = System.nanoTime();
                    //
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }
```

### 

 Java JVM  Java  API  `java.lang.Object`  `Object` 

### 

~~ `loadClass()` ~~

** [issue871](https://github.com/Snailclimb/JavaGuide/issues/871) **  `ClassLoader`  `ClassLoader`  `findClass()`  `loadClass()` 

## 

 `BootstrapClassLoader`  Java `java.lang.ClassLoader` `ClassLoader`

## 

- 
- 
- 

Web Proxy Viewer  |  New URL  |  Original Page