即使技术强大,面试时一问这个必挂!!
本文我们一路接头Java类的加载、链接和初始化。Java字节代码的示意情势是字节数组(byte[]),而Java类在JVM中的示意情势是 java.lang.Class类 的工具。一个Java类从字节代码到可以或许在JVM中被行使,必要颠末加载、链接和初始化这三个步调。这三个步调中,对开拓职员直接可见的是Java类的加 载,通过行使Java类加载器(class loader)可以在运行时候动态的加载一个Java类;而链接和初始化则是在行使Java类之前会产生的举措。本文会具体先容Java类的加载、链接和 初始化的进程。 Java 类的加载 Java类的加载是由类加载器来完成的。 一样平常来说,类加载器分成两类:启动类加载器(bootstrap)和用户自界说的类加载器(user-defined)。 两者的区别在于启动类加载器是由JVM的原生代码实现的,而用户自界说的类加载器都担任自Java中的 java.lang.ClassLoader类。在用户自界说类加载器的部门,一样平常JVM城市提供一些根基实现。应用措施的开拓职员也可以按照必要编写本身的类加载器。JVM中最常行使的是体系类加载器(system),它用来启动 Java应用措施的加载。通过java.lang.ClassLoader的 getSystemClassLoader()要领可以获取到该类加载器工具。 类加载器必要完成的最终成果是界说一个Java类,即把Java字节代码转换成JVM中的java.lang.Class类的工具。可是类加载的进程并不是这么简朴。 Java类加载器有两个较量重要的特性:条理组织布局和署理模式。 条理组织布局指的是每个类加载器都有一个父类加载器,通过 getParent()要领可以获取到。类加载器通过这种父亲-儿女的方法组织在一路,形成树状条理布局。署理模式则指的是一个类加载器既可以本身完成Java类的界说事变,也可以署理给其余的类加载器来完成。因为署理模式的存在,启动一个类的加载进程的类加载器和最终界嗣魅这个类的类加载器也许并不是一个。前者称为初始类加载器, 尔后者称为界说类加载器。 两者的关联在于:一个Java类的界说类加载器是该类所导入的其余Java类的初始类加载器。好比类A通过import导入了类 B,那么由类A的界说类加载器认真启动类B的加载进程。一样平常的类加载器在实行本身去加载某个Java类之前,会起首署理给其父类加载器。当父类加载器找不到的时辰,才会实行本身加载。这个逻辑是封装在java.lang.ClassLoader类的 loadClass()要领中的。一样平常来说,父类优先的计策就足够好了。在某些环境下,也许必要采纳相反的计策,即先实行本身加载,找不到的时辰再署理给父类加载器。这种做法在Java的Web容器中较量常见,也是 Servlet类型保举的做法。好比,Apache Tomcat为每个Web应用都提供一个独立的类加载器,行使的就是本身优先加载的计策。IBM WebSphere Application Server则应承Web应用选择。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |