类加载器是JVM执行类加载机制的前提
ClassLoader的作用:
ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例。然后交给Java虚拟机进行链接、初始化等操作。因此,ClassLoader在整个装载阶段,只能影响到类的加载,而无法通过ClassLoader去改变类的链接和初始化行为。至于它是否可以运行,则由Execution Engine决定。
类加载器最早出现在Java1.0版本中,那个时候只是单纯地为了满足Java Applet应用而被研发出来。但如今类加载器却在OSGI、字节码加解密领域大放异彩。这主要归功于Java虚拟机的设计者们当初在设计类加载器的时候,并没有考虑将它绑定在JVM内部,这样做的好处就是能够更加灵活和动态执行类加载操作。
类的加载分类:显示加载 vs 隐式加载
class文件的显示加载与隐式加载的方式是指JVM加载class文件到内存的方式。
- 显示加载指的是在代码中通过调用ClassLoader加载class对象,如果直接使用Class.forName(name)或this.getClass().getClassLoader().loadClass加载class对象。
- 隐式加载则是不直接在代码中调用ClassLoader的方法加载class对象,而是通过虚拟机自动加载到内存中,如在加载某个类的class文件时,该类的class文件中引用了另外一个类的对象,此时额外引用的类将通过JVM自动加载到内存中。
类加载器的必要性
一般情况下,Java开发人员并不需要在程序中显示地使用类加载器,但是了解类加载器的加载机制却显得至关重要。从以下几个方面说:
- 避免在开发中遇到 java.lang.ClassNotFoundException异常或者java.lang.NoClassDefFoundError异常时,手足无措。只有了解类加载器的加载机制才能够在出现异常的时候快速地根据错误异常日志定位问题和解决问题
- 需要支持类的动态加载或需要对编译后的字节码文件进行加解密操作时,就需要与类加载器打交道了。
- 开发人员可以在程序中编写自定义类加载器来重新定义类的加载规则,以便实现一些自定义的处理逻辑。
梦想很模糊,去追,它会渐变清晰。青春励志,奋斗下去别放弃。
网友评论