在线工具 在线编程 在线白板 在线工具 在线编程 在线白板

015 反射中的 Class.forName() 与 ClassLoader.loadClass() 的区别

是这样的,想请说下,015 反射中的 Class.forName() 与 ClassLoader.loadClass() 的区别
最新回答
淡定是葱de风格じ丶

2025-03-26 11:34:05

Class.forName()与ClassLoader.loadClass()都是Java反射机制中的类加载方法。它们在实现类的加载与使用时有细微区别。

类加载过程在Java中分为三个步骤:加载、链接和初始化。链接过程又包括验证、准备和解析。各个步骤按顺序执行,其中解析步骤除外。

Class.forName()方法实际调用的是Class.forName(className,true,classloader)。这里的关键在于第二个布尔参数。当此参数设置为true时,表示在加载类后必须执行初始化操作。因此,在调用此方法后,目标对象的静态块代码已被执行,静态变量也已初始化。

相比之下,ClassLoader.loadClass()方法则调用的是ClassLoader.loadClass(className,false)。此处的布尔参数不同,它表示在加载类后不进行链接。这意味着该类的静态块中的内容不会被执行。由此可见,Class.forName()与ClassLoader.loadClass()的主要区别在于是否执行类的初始化以及静态块内容的执行。

简而言之,Class.forName()在加载类后会执行初始化操作并运行静态块,而ClassLoader.loadClass()则在加载类后不进行链接,因此不会执行静态块内容。这使得它们在具体应用中展现出不同的功能和用途。