类加载机制
类加载器(ClassLoader):
类加载器负责将.class文件加载到JVM中。Java虚拟机使用一个分层的类加载器架构,通常包括以下几种类型的类加载器:
- 启动类加载器(Bootstrap ClassLoader):负责加载Java核心库类,如
java.lang.Object
。 - 扩展类加载器(Extension ClassLoader):负责加载扩展目录(如
jre/lib/ext
)中的类库。 - 应用类加载器(System ClassLoader):负责加载应用程序类路径(如
-cp
参数指定的路径)上的类库。
类加载过程:
Java类的加载过程通常包括以下三个步骤:
- 加载(Loading):类加载器找到.class文件,并将它加载到JVM中。
- 链接(Linking):包括验证(确保加载的类信息符合JVM规范)、准备(为静态变量分配内存并设置默认初始值)和解析(将符号引用替换为直接引用)。
- 初始化(Initialization):执行类构造器
<clinit>()
方法,为静态变量赋予正确的初始值。
类对象(Class Object):
每个加载到JVM中的类都有一个对应的java.lang.Class
对象,它包含了类的元数据信息,如类的名称、字段、方法、构造函数等。
反射API:
Java反射API提供了一组类和接口,用于操作Class
对象和类的成员。主要的类和接口包括:
Class
:代表类和接口的静态类型信息。Field
、Method
、Constructor
:分别代表类的字段、方法和构造函数。Array
:提供动态创建和访问Java数组的方法。
获取 Class 对象:
在反射中,可以通过以下方式获取Class
对象:
- 使用类字面量:
Class<?> clazz = MyClass.class;
- 通过实例对象的
getClass()
方法:MyClass obj = new MyClass(); Class<?> clazz = obj.getClass();
- 使用类加载器的
loadClass()
方法。
动态类加载:
使用反射,可以在运行时动态加载和使用类。这可以通过调用类加载器的loadClass()
方法实现,也可以通过自定义类加载器实现。
访问控制:
使用反射可以绕过Java的访问控制,访问私有成员。这通过调用AccessibleObject
(Field
、Method
和Constructor
的超类)的setAccessible(true)
方法实现。
类型转换和实例化:
使用反射,可以创建类的实例,即使类没有可访问的构造函数。这通过调用Class
对象的newInstance()
方法实现,或者使用Constructor
对象的newInstance()
方法。
异常处理:
反射操作可能会抛出多种异常,如ClassNotFoundException
、IllegalAccessException
、InstantiationException
、NoSuchFieldException
、NoSuchMethodException
等。这些异常需要在反射操作中进行适当的处理。
。
标签:反射,Java,JVM,机制,方法,Class,加载 From: https://www.cnblogs.com/luoyiwen123/p/18347837