目录
2.2.2 问题:编写的java.lang.String不能加载的原因?
1.类加载概念
类加载将类文件(class文件)加入JVM中进行管理。(即类文件加载到内存的过程)
注:类加载只负责加载到内存,其是否运行由执行引擎Execution Engine决定。
2.类加载器的分类
2.1 分类的关系图及代码验证
2.1.1 查看加载类所在的位置
public class demo{
public static void main(String[] args) {
System.out.println("Application"+System.getProperty("java.class.path"));
System.out.println("Extension"+System.getProperty("java.ext.dirs"));
System.out.println("Bootstrap"+System.getProperty("sun.boot.class.path"));
}
}
执行结果如下图所示:
2.1.2 定义类,进行加载,查看其加载器及其父类
public class Car {
public static void main(String[] args){
//加载Car类 class关键字-->属性clazz
Class<?> clazz = Car.class;
//查看Car类的加载器
System.out.println(clazz.getClassLoader());
//该加载器的父亲
System.out.println(clazz.getClassLoader().getParent());
该加载器的父亲的父亲
System.out.println(clazz.getClassLoader().getParent());
}
}
执行结果如下图所示:
2.2 双亲委派机制
2.2.1 概念
当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此。只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载。
例如:Car.class-->Application(加载)-->Extension(检查)-->Bootstrap(检查)
父类无法执行,即不断下发。
2.2.2 问题:编写的java.lang.String不能加载的原因?
该程序能编译,但不能执行。
3.类加载的流程
3.1 流程图图示
3.2 获取Class对象代码验证
public class Animal {
public static void main(String[] args) throws ClassNotFoundException {
Animal an = new Animal();
//类名.class
System.out.println(Animal.class);
//对象.getClass()
System.out.println(an.getClass());
//Class.forName("包名.类名") class关键字-->使用clazz
Class<?> clazz = Class.forName("com.it.classloader.Animal");
System.out.println(clazz);
}
}
执行结果如下图所示: