
java
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
Class<?> c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
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
package com.roy.classLoader;
public class LoaderDemo {
public static String a ="aaa";
public static void main(String[] args) throws ClassNotFoundException {
// 父子关系 AppClassLoader <- ExtClassLoader <- BootStrap Classloader
ClassLoader cl1 = LoaderDemo.class.getClassLoader();
System.out.println("cl1 > " + cl1);
System.out.println("parent of cl1 > " + cl1.getParent());
// BootStrap Classloader由C++开发,是JVM虚拟机的一部分,本身不是JAVA类。
System.out.println("grant parent of cl1 > " + cl1.getParent().getParent());
// String,Int等基础类由BootStrap Classloader加载。
ClassLoader cl2 = String.class.getClassLoader();
System.out.println("cl2 > " + cl2);
System.out.println(cl1.loadClass("java.util.List").getClass().getClassLoader());
// java指令可以通过增加-verbose:class -verbose:gc 参数在启动时打印出类加载情况
// BootStrap Classloader,加载java基础类。这个属性不能在java指令中指定,推断不是由java语言处理。。
System.out.println("BootStrap ClassLoader加载目录:" + System.getProperty("sun.boot.class.path"));
// Extention Classloader 加载JAVA_HOME/ext下的jar包。 可通过-D java.ext.dirs另行指定目录
System.out.println("Extention ClassLoader加载目录:" + System.getProperty("java.ext.dirs"));
// AppClassLoader 加载CLASSPATH,应用下的Jar包。可通过-D java.class.path另行指定目录
System.out.println("AppClassLoader加载目录:" + System.getProperty("java.class.path"));
}
}

这个是沙箱保护 就是不让你有java开头的包名





比如a指向b 但是此时b还没在内存 就用符号表示引用关系




new Apple时,price还是半初始化状态 就是等于0,所以最后打印的 是-10



public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
为啥有resolve参数,却不给我们赋值用,只能是false
核心原因:resolve参数控制是否触发类的 "链接阶段",默认传false是为了懒解析------ 类加载时只完成 "加载",延迟到首次使用时才做 "验证、准备、解析",提升 JVM 启动速度和内存效率。

我们Java是不是都希望说,我要用多少内存,在启动时候我就配置好,对吧?
比如说我有十个G的内存,那我就跑,跑的时候我就跑八个G,那我就用这八个G内存就够了。
那现在变成什么?
八个G的内存已经用完了,然后我用classForName又要重新申请内存,这样是不是不够安全?
所以这是这两个方法的一个区别