Java通过类名加载类
在Java中,类是一种数据结构,用于定义对象的属性和方法。在程序中使用类时,我们需要将类加载到内存中,并使用它来创建对象或调用方法。Java提供了一种称为“类加载”的机制,通过这种机制,我们可以通过类名来加载类并创建对象。
类加载过程
在Java中,类的加载过程可以分为如下几个步骤:
-
加载(Loading):查找类的字节码文件,并将其加载到内存中。在Java中,可以使用类加载器来完成这个过程。类加载器会根据类的全限定名(即包名加类名)来查找类的字节码文件,并将其加载到内存中。
-
连接(Linking):连接阶段分为三个步骤,包括验证、准备和解析。
-
验证(Verification):验证阶段主要是对类的字节码文件进行验证,确保它符合Java虚拟机的规范。这个过程主要是为了防止恶意代码的执行,保证程序的安全性。
-
准备(Preparation):准备阶段主要是为类的静态变量分配内存,并设置默认的初始值。这个过程会为所有的静态变量分配内存空间,并设置默认的初始值,例如对于整型变量,默认的初始值为0。
-
解析(Resolution):解析阶段主要是将符号引用转换为直接引用。在Java中,类的方法和字段通过符号引用来引用,而在解析阶段,这些符号引用会被转换为直接引用,以便程序能够正确访问类的方法和字段。
-
-
初始化(Initialization):初始化阶段主要是对类的静态变量进行赋值,并执行静态代码块。在这个阶段,会按照程序的逻辑顺序对静态变量进行赋值,并执行静态代码块。这个阶段完成后,类就可以被正常使用了。
类加载器
在Java中,类加载器是用来加载类的一种机制。它负责查找类的字节码文件,并将其加载到内存中。Java提供了三种类加载器,分别是Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader。
-
Bootstrap ClassLoader:它是最顶层的类加载器,负责加载Java的核心类库,例如
java.lang
包中的类。这个类加载器是由C++实现的,并不是Java语言本身实现的。 -
Extension ClassLoader:它负责加载Java的扩展类库,例如
javax
包中的类。这个类加载器是由Java语言实现的,是sun.misc.Launcher$ExtClassLoader
类的实例。 -
Application ClassLoader:它负责加载应用程序的类,即我们自己编写的类。这个类加载器是由Java语言实现的,是
sun.misc.Launcher$AppClassLoader
类的实例。
通常情况下,我们只需要关注Application ClassLoader,因为它负责加载我们自己编写的类。
通过类名加载类
在Java中,我们可以通过类名来加载类。具体来说,可以通过以下两种方式来实现:
- 使用Class.forName()方法:这个方法是Java提供的一种反射机制,可以通过类名来加载类。该方法会返回一个
java.lang.Class
对象,可以通过这个对象来创建对象或调用方法。下面是这种方式的示例代码:
Class<?> clazz = Class.forName("com.example.MyClass");
Object obj = clazz.newInstance();
- 使用类的字节码文件:在Java中,类的字节码文件是以
.class
文件的形式存储在磁盘上的。我们可以通过ClassLoader
类的loadClass()
方法来加载字节码文件,并返回一个java.lang.Class
对象。下面是这种方式的示例代码:
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class<?> clazz = classLoader.loadClass("