动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

10道Java类加载器面试题(附答案)

07-21 17:33 288浏览
举报 T字号
  • 大字
  • 中字
  • 小字

类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行,对理解java虚拟机的连接模型和java语言的动态性都有很大帮助。今天整理了10道java类加载器面试题,一起看下去吧。

1、JVM的默认类加载器都有什么?

答:JVM的默认类加载器有三个:(1引导(Bootstrap)类加载器。由原生代码C语言编写,不继承java.lang.ClassLoader。负责加载核心Java库,存储在/jre/lib目录中。

2扩展(Extensions)类加载器。用来在指明的目录中加载Java的扩展类。Java虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载Java类。该类由sun.misc.Launcher$ExtClassLoader实现。

3Apps类加载器(也称系统类加载器)。根据Java应用程序的类路径来加载Java类。一般来说,Java应用程序的类都是由它来完成加载的,可以通过ClassLoader.getSystemClassLoader()来获取它。该类由sun.misc.Launcher$AppClassLoader来实现。

2、Java的类加载器的种类都有哪些?

 答:(1根类加载器(Bootstrap)--C++写的,看不到源码;2扩展类加载器(Extension)--加载位置:jre\lib\ext中;3系统(应用)类加载器(System\App) --加载位置:classpath中;4自定义加载器(必须继承ClassLoader)。

3、类的初始化步骤是什么?

答:如果这个类还没有被加载和链接,那先进行加载和链接;假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口);加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句。

4、描述一下 JVM 加载 class?

答:JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。

1)由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。

2)当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。

3)当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;如果类中存在初始化语句,就依次执行这些初始化语句。

4)类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。

5)从Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。

5、获得一个类对象有哪些方式?

答:(1)类型.class,例如:String.class;

2)对象.getClass(),例如:”hello”.getClass();

3)Class.forName(),例如:Class.forName(“java.lang.String”);

6、Java类加载体系之ClassLoader双亲委托机制是什么?

答:java语言是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是:类加载体系;class文件检验器;内置于Java虚拟机(及语言)的安全特性;安全管理器及Java API。

7、类什么时候被初始化?

答:创建类的实例,也就是new一个对象;访问某个类或接口的静态变量,或者对该静态变量赋值;调用类的静态方法;初始化一个类的子类(会首先初始化子类的父类);反射(Class.forName("com.lyj.load"));JVM启动时标明的启动类,即文件名和类名相同的那个类只有这6中情况才会导致类的类的初始化。

8、双亲委派托机制为什么安全?

答:举个例子,ClassLoader加载的class文件来源很多,比如编译器编译生成的class、或者网络下载的字节码。而一些来源的class文件是不可靠的,比如我可以自定义一个java.lang.Integer类来覆盖jdk中默认的Integer类,例如下面这样:

package java.lang;
public class Integer {
    public Integer(int value) {
        System.exit(0);
    }
}

初始化这个Integer的构造器是会退出JVM,破坏应用程序的正常进行,如果使用双亲委派机制的话该Integer类永远不会被调用,以为委托BootStrapClassLoader加载后会加载JDK中的Integer类而不会加载自定义的这个,可以看下下面这测试个用例:

public static void main(String...args){
        Integer i=new Integer(1);
        System.err.println(i);
}

执行时JVM并未在new Integer(1)时退出,说明未使用自定义的Integer,于是就保证了安全性。

9、Class.forName 和 ClassLoader.loadClass 都能加载类,这两者在加载类时的区别?

答:Class.forName有重载方法可以指定是否需要初始化,而默认的方法初始化设置为true这会初始化类执行链接和初始化操作。

ClasaLoader是有类加载器的loadClass方法加载,传入的是false,只会执行连接操作,不会初始化操作。

10、JVM在搜索类的时候,怎样判定两个class是相同的呢?

答:JVM在判定两个class是否相同时,不仅要判断两个类名是否相同,而且要判断是否由同一个类加载器实例加载的。只有两者同时满足的情况下,JVM才认为这两个class是相同的。就算两个class是同一份class字节码,如果被两个不同的ClassLoader实例所加载,JVM也会认为它们是两个不同class。

Java中的类加载器是一个重要的java运行时系统组件,它负责在运行时查找和装入类文件中的类。想要学好java,类加载器的知识是必须掌握的,所以上面java类加载器面试题希望大家可以学好,在将来的java面试中 ,是非常有可能考到的。

0人推荐
共同学习,写下你的评论
0条评论
妄想没有错
程序员妄想没有错

5篇文章贡献24586字

作者相关文章更多>

推荐相关文章更多>

Java数据结构

HelloWorld10-31 08:24

浅谈MySQL中SQL优化的常用方法

军哥08-12 23:29

五分钟读懂UML类图

江湖人称小李白12-10 10:41

MyBatis开发框架的四大核心

IT逐梦者08-17 21:43

一次搞定continue,break和return

HelloWorld11-06 11:19

发评论

举报

0/150

取消