1.类加载器

  •    类加载器是当程序运行时要使用某个类,则类加载器就加该类的字节码加载到内存里执行。
  •    Java虚拟机可以安装多个类加载器,系统默认三个主要的类加载器,每个类加载器负责加载不同位置的类
  •        Bootstrap,ExtClassLoader,AppClassLoader。
  • 也是Java类,所以必须有一个非Java类的加载器加载其他Java类的类加载器,这个就是Boostrap。
  • 所有类加载器采用具有父子关系的树形结构进行组织。每个实例化类加载器对象时必须为其指定
  •        一个父级的类加载器对象,或采用系统默认的类加载器作为父级。

2.ClassLoader

构造方法:
        ClassLoader();//使用方法 getSystemClassLoader() 返回的 ClassLoader
        ClassLoader(ClassLoader parent);//指定父类加载器,父类可能最终调用Bootstrap作为最后的父级。
   成员方法:
        ClassLoader  getParent();//返回委托的父类加载器。
        static  ClassLoader  getSystemClassLoader();//返回系统的类加载器
        Class<?> loadClass(String name);//使用指定的二进制名称来加载类。
        Class<?> findClass(String name);//使用指定的二进制名称查找类.
        Class<?> defineClass(byte [] b,int off ,int len);//读取byte数组转成类实例

3.三大类加载器的关系及加载类的范围

 

java查看类下面的方法 java的类加载器_java查看类下面的方法

   BootStrap(启动类加载器):

                 常用的Java类,如System,util下的集合类等等。

   ExtClassLoader(扩展类加载器):

                        遵循双亲委派模型,即两种加载类的方式,一是loadClass方法,二是findClass方法。 它重写了findClass方法

                        当父类的loadClass方法找不到类,且它也找不到时,就会使用findClass方法加载类,还不行就会报异常错误。

                        我们可以通过右键该类export,将我们自定义的类导出到该类加载器的文件夹下,

   AppClassLoader(应用程序类加载器):

                        没有遵循双亲委派模型,即一种加载类的方式,即loadClass方法,它重写了loadClass方法,

class NetworkClassLoader extends ClassLoader {
         String host;
         int port;

         public Class findClass(String name) {
             byte[] b = loadClassData(name);
             return defineClass(name, b, 0, b.length);
         }

         private byte[] loadClassData(String name) {
             // load the class data from the connection
              . . .
         }
     }

JVM中,即没有重名的类加载上了。

JVM中,即有同名不同功能的类都加载上来了

4.类加载器的(双亲)委托机制

直到祖宗加载该类,

最初委托的加载器(如果重写了findClass方法,则使用该方法加载类)。

ClassNotFoundException

  • 首先当前线程的类加载器(getContextClassLoader())去加载线程中的第一个类。
  • 如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。
  • 还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。