一、ClassLoader的常见方法及获取方式
- 除引导类加载器外的类加载器都继承自ClassLoader
- classloader的常用方法
| 方法名称 | 描述 |
|---|---|
| getParent() | 返回该类加载器的超类加载器 |
| loadClass(String name) | 加载名称为name的类,并返回java.lang.class实例 |
| findClass(String name) | 加载名称为name的类,并返回java.lang.class实例 |
- 获取ClassLoader的途径
- Class.forName("XXX").getClassLoader():获得XXX类的类加载器
- Thread.currentThread().getContextClassLoader():获得当前线程上下文的加载器
- ClassLoader.getSystemLoader():获得系统的加载器
二、双亲委派机制
- 虚拟机采用按需加载的方式加载class,加载class采用双亲委派机制
- 解释下双亲委派:
- 如果一个类加载器收到类加载的请求,并不会自己先去加载,而是把这个请求委托给父类加载器去执行
- 如果父类加载器还存在父类加载器,则继续向上委派。知道引导类加载器
- 如果父类加载器能够加载类,则返回;如果不能,则向下委托给子类加载器,直到类能够被加载
- 可以尝试自己创建一个java.lang.String类去验证这个问题
- 优点:
- 避免类的重复加载
- 保证程序的安全,防止核心的程序被篡改
三、沙箱安全机制
- 保护核心的api不受侵害的机制就是沙箱安全机制
- 举个例子:自己创建一个java.lang.XXX类的时候,其实是不能正常使用这个类的
四、类的主动使用和被动使用
- 类的主动使用:
- 创建类的对象实例
- 访问使用类或者接口的静态变量
- 调用类的静态方法
- 通过反射去创建类对象
- 初始化一个类的子类
- 类被标记为虚拟机启动时必须的类
- 除了上面的几种主动使用类的情况,其余都是被动使用类
- 主动、被动的区别:
- 被动使用类不会进行类的初始化