---
category: Java
tag:
- JVM
---
#
##
**->->****->->**

`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`

```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`
##
-
-
-