[Java基础]5. Java类加载机制和反射机制
一、Java类加载机制
jvm把class文件加载到内存,并对数据进行校验、解析和初始化,最终形成jvm可以直接使用的java类型的过程。
- 加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口。
- 链接:将java类的二进制代码合并到jvm的运行状态之中的过程,链接过程又分为3个过程:
- 验证:确保加载的类信息符合jvm规范,没有安全方面的问题。
- 准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。
- 解析:虚拟机常量池内的符号引用替换为直接引用的过程。(比如String s =“aaa”,转化为 s的地址指向“aaa”的地址)
- 初始化:初始化阶段是执行类构造器方法的过程。类构造器方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生的。
- 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先初
始化其父类的初始化 - 虚拟机会保证一个类的构造器方法在多线程环境中被正确加锁和同步
- 当访问一个java类的静态域时,只有真正声明这个静态变量的类才会被初始化。
- 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先初
Java类的生命周期
二、ClassLoader类加载器
ClassLoader类加载器的作用就是将.class
文件加载到JVM虚拟机中去。
public class ClassLoaderDemo {
public static void main(String[] args) throws ClassNotFoundException {
//获取类加载器
ClassLoader classLoader= ClassLoaderDemo.class.getClassLoader();
//常用三种方式加载类
// 使用ClassLoader.loadClass()来加载类,不会执行初始化块
System.out.println("‐‐ClassLoader.loadClass()‐‐");
classLoader.loadClass("com.gx.reflect.Test1");
// 使用Class.forName(clssName)来加载类,默认会执行初始化块
System.out.println("‐‐Class.forName(className)‐‐");
Class.forName("com.gx.reflect.Test2");
// 使用Class.forName(className,initialize,ClassLoader)来加载类,并指定ClassLoader,// 参数:类名,是否初始化,类加载器
System.out.println("‐‐Class.forName(className,initialize,ClassLoader)‐‐"
Class.forName("com.gx.reflect.Test3", false, classLoader);
}
}
class Test1 {
static {
System.out.println("Test1 静态初始化块");
}
}
class Test1 {
static {
System.out.println("Test2 静态初始化块");
}
}
class Test1 {
static {
System.out.println("Test3 静态初始化块");
}
}
‐‐ClassLoader.loadClass()‐‐
‐‐Class.forName(className)‐‐
Test2 静态初始化块
‐‐Class.forName(className,initialize,ClassLoader)‐‐
三、Java反射机制
在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。
Class类常用类
方法 | 返回值 | 说明 |
---|---|---|
forName(String className) |
Class | 返回与带有给定字符串名的类或接口相关联的 Class 对象。 |
forName(String name, boolean initialize, ClassLoader loader) |
Class | 使用给定的类加载器 |
getClassLoader() |
ClassLoader | 返回该类的类加载器。 |
getConstructor(Class... parameterTypes) |
Constructor | 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。 |
getConstructors() |
Constructor[] | |
getDeclaredConstructor(Class... parameterTypes) |
Constructor | |
getDeclaredConstructors() |
Constructor[] | |
getDeclaredField(String name) |
Field | |
getDeclaredFields() |
Field[] | |
getDeclaredMethod(String name, Class... parameterTypes) |
Method | |
getDeclaredMethods() |
Method[] | |
getField(String name) |
Field | |
getField(String name) |
Field[] | |
getMethod(String name, Class... parameterTypes) |
Method | |
getMethods() |
Method[] |