作用:将类的字节码加载到jvm中,并进行一些处理.
系统默认的类加载器:
类加载器也是一个类,类加载器是由BootStrap加载的,它是嵌套在内核中的一段二进制代码,由c++编写的.
类加载器 加载范围
BootStrap ---> JRE/lib/rt.jar
ExtClassLoader ---> JRE/lib/ext/*.jar
AppClassLoader ---> CLASSPATH指定的所有jar或目录
类加载器的委托机制
java虚拟机要加载一个类时,到底派出哪个类加载器去加载?
(1)由当前线程的类加载器加载线程中的第一个类
(2)如果类A中引用了类B,Java虚拟机使用加载类的A的类加载器加载B
(3)还可以使用ClassLoader.loadClass()方法指定某个类加载器去加载某个类
系统默认的类加载器的委托机制:
当前线程使用AppClassLoader加载器,AppClassLoader委托给ExtClassLoader,ExtClassLoader委托给BootStrap,
BootStrap在JRE/lib/rt.jar查找,如果类存放在该目录下就加载,否则让ExtClassLoader在JRE/lib/ext/*.jar
目录下查找,有就加载,否则让AppClassLoader在CLASSPATH指定的所有jar或目录查找,有就加载,没有就抛出异常.
委托机制的优点:加载器之间相互联系,形成一种加载机制,避免了多个加载同时加载同一类或jar包,保证jvm中只有一份字节码文件.
编写自定义的类加载器
模板方法设计模式
ClassLoader类的介绍
Class<?> loadClass(String name)
使用指定的二进制名称来加载类。 //内部方法采用委托机制会自动调用类加载器的父类,当返回时再调用findClass()方法
protected Class<?> findClass(String name)
使用指定的二进制名称查找类。
protected Class<?> defineClass(String name, byte[] b, int off, int len)
调用顺序 父类加载器--返回-->loadClass()--调用-->findClass()--二进制数据返回字节码文件-->defineClass()
创建自定义的类加载器:
(1)继承ClassLoader
(2)重写findClass()方法
如何使用自定义额加载器
Class c=new 自定义类加载器类名().loadClass("指定加载的类");//通过使用自定义类加载器获得指定类的字节码文件对象
系统默认的类加载器:
类加载器也是一个类,类加载器是由BootStrap加载的,它是嵌套在内核中的一段二进制代码,由c++编写的.
类加载器 加载范围
BootStrap ---> JRE/lib/rt.jar
ExtClassLoader ---> JRE/lib/ext/*.jar
AppClassLoader ---> CLASSPATH指定的所有jar或目录
类加载器的委托机制
java虚拟机要加载一个类时,到底派出哪个类加载器去加载?
(1)由当前线程的类加载器加载线程中的第一个类
(2)如果类A中引用了类B,Java虚拟机使用加载类的A的类加载器加载B
(3)还可以使用ClassLoader.loadClass()方法指定某个类加载器去加载某个类
系统默认的类加载器的委托机制:
当前线程使用AppClassLoader加载器,AppClassLoader委托给ExtClassLoader,ExtClassLoader委托给BootStrap,
BootStrap在JRE/lib/rt.jar查找,如果类存放在该目录下就加载,否则让ExtClassLoader在JRE/lib/ext/*.jar
目录下查找,有就加载,否则让AppClassLoader在CLASSPATH指定的所有jar或目录查找,有就加载,没有就抛出异常.
委托机制的优点:加载器之间相互联系,形成一种加载机制,避免了多个加载同时加载同一类或jar包,保证jvm中只有一份字节码文件.
编写自定义的类加载器
模板方法设计模式
ClassLoader类的介绍
Class<?> loadClass(String name)
使用指定的二进制名称来加载类。 //内部方法采用委托机制会自动调用类加载器的父类,当返回时再调用findClass()方法
protected Class<?> findClass(String name)
使用指定的二进制名称查找类。
protected Class<?> defineClass(String name, byte[] b, int off, int len)
调用顺序 父类加载器--返回-->loadClass()--调用-->findClass()--二进制数据返回字节码文件-->defineClass()
创建自定义的类加载器:
(1)继承ClassLoader
(2)重写findClass()方法
如何使用自定义额加载器
Class c=new 自定义类加载器类名().loadClass("指定加载的类");//通过使用自定义类加载器获得指定类的字节码文件对象