1. 定义
负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。
Java培训
2. 类加载器分类
- 虚拟机自带的加载器
- 启动类加载器(Bootstrap)C++
- 扩展类加载器(Extension)Java
- 应用程序类加载器(AppClassLoader)Java (也叫系统类加载器,加载当前应用的classpath的所有类)
Java培训
- 用户自定义加载器
- Java.lang.ClassLoader的子类,用户可以定制类的加载方式
- 双亲委派与沙箱安全机制
- 双亲委派机制:某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
- 沙箱安全机制:网络上有个名叫java.lang.Integer的类,它是某个黑客为了想混进java.lang包所起的名字,实际上里面含有恶意代码,但是这种 伎俩在双亲模式加载体系结构下是行不通的,因为网络类加载器在加载它的时候,它首先调用双亲类加载器,这样一直向上委托,直到启动类加载器,而启动类加载 器在核心Java API里发现了这个名字的类,所以它就直接加载Java核心API的java.lang.Integer类,然后将这个类返回,所以自始自终网络上的 java.lang.Integer的类是不会被加载的。
Java培训
- 示例代码
package com.atguigu.jvm;
public class Demo01 {
private static final String NUMBER=”7″;
public static void test01() {
}
public static void test02() {
System.out.println(“trst02”);
}
public static int add(int x,int y) {
int result = -1;
result = x + y;
return result;
}
public static void main(String[] args) {
Object obj = new Object();
Demo01 d01 = new Demo01();
String str = new String(“abc”);
System.out.println(obj.getClass().getClassLoader());
System.out.println(d01.getClass().getClassLoader().getParent().getParent());
System.out.println(d01.getClass().getClassLoader().getParent());
System.out.println(d01.getClass().getClassLoader());
}
}