1、定义:
寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件。
2、种类:
- BootstrapClassLoader:用C++编写的,装载jre中的核心类库;
- ExtClassLoader:装载jre目录下的ext中的jar类;
- AppClassLoader:装载ClassPath路径下的类.
- UrlClassLoader:装载Url指定的类;
3、测试:
- public class Test {
- public static void main(String[] args) {
- ClassLoader loader = Test.class.getClassLoader();
- while (loader != null) {
- System.out.println(loader.getClass().getName());
- loader = loader.getParent();
- }
- System.out.println(loader);
- }
- }
输入结果:
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
null
说明:
- null:BootstrapClassLoader是用C++编写,而JVM设置ExtClassLoader的父加载器是null罢了;
4、一个自定义类加载器的例子:
- package classloader;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- /**
- *
- * 一、ClassLoader加载类的顺序
- * 1.调用 findLoadedClass(String) 来检查是否已经加载类。
- * 2.在父类加载器上调用 loadClass 方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。
- * 3.调用 findClass(String) 方法查找类。
- * 二、实现自己的类加载器
- * 1.获取类的class文件的字节数组
- * 2.将字节数组转换为Class类的实例
- *
- */
- public class ClassLoaderTest {
- public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
- //新建一个类加载器
- MyClassLoader cl = new MyClassLoader("myClassLoader");
- //加载类,得到Class对象
- Class<?> clazz = cl.loadClass("classloader.Animal");
- //得到类的实例
- Animal animal=(Animal) clazz.newInstance();
- animal.say();
- }
- }
- class Animal{
- public void say(){
- System.out.println("hello world!");
- }
- }
- class MyClassLoader extends ClassLoader {
- //类加载器的名称
- private String name;
- //类存放的路径
- private String path = "E:\\workspace\\Algorithm\\src";
- MyClassLoader(String name) {
- this.name = name;
- }
- MyClassLoader(ClassLoader parent, String name) {
- super(parent);
- this.name = name;
- }
- /**
- * 重写findClass方法
- */
- @Override
- public Class<?> findClass(String name) {
- byte[] data = loadClassData(name);
- return this.defineClass(name, data, 0, data.length);
- }
- public byte[] loadClassData(String name) {
- try {
- name = name.replace(".", "//");
- FileInputStream is = new FileInputStream(new File(path + name + ".class"));
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- int b = 0;
- while ((b = is.read()) != -1) {
- baos.write(b);
- }
- return baos.toByteArray();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- }
本代码来自:http://www.oschina.net