【JAVA面向对象】认识反射机制(一)

一、类加载

1.1类加载概念

在class文件加载到jvm中时,会对应创建一个Class对象;分为三步:加载、连接、初始化。

  • 加载

    • 将class文件加载到内存区域,对应生成一个Class对象
  • 连接

    • 验证
      • 验证类的结构是否正确
    • 准备
      • 初始化静态成员
    • 解析
      • 将字节码文件转换成jvm能够执行的引用(对象、变量、方法)
  • 初始化

    • 就是对变量的初始化

1.2类加载时机

  • 创建类对象的实例
  • 访问类的静态变量,或者为静态变赋值
  • 调用类的静态方法
  • 使用反射方法来强制创建某个类或接口对应的java.lang.Class对象
    • ​ 如Class.forName(“com.mysql.jdbc.Driver”);创建了Driver类的运行对象
  • 初始化某个类的子类
  • 直接使用java.exe命令来运行某个主类

1.3类加载器的概述和分类

1.3.1 类加载器的概述

  • 负责将.class文件加载到内存中,并为之生成对应的Class对象。

1.3.2 类加载器的分类

  • Bootstrap ClassLoader 根类加载器
  • Extension ClassLoader 扩展类加载器
  • System ClassLoader 系统类加载器

1.3.3 类加载器的作用

  • Bootstrap ClassLoader 根类加载器

    • 也称为引导类加载器,负责Java核心类的加载
    • 比如System,String等,在JDK中JRE的lib目录下rt.jar文件中
  • Extension ClassLoader 扩展类加载器

    • 负责JRE的扩展目录中jar包中类的加载
    • 在JDK中JRE的lib目录下ext目录
  • System ClassLoader 系统类加载器

    • 负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径

二、反射

2.1 反射概述

  • java反射机制是在运行状态中,对任意一个类,都能知道这个类的所有属性和方法;
  • 对任意一个对象,都能调用它的任意一个方法和属性;
  • 这种动态获取的信息以及动态调用对象的方法的功能成为Java语言的反射机制。
  • 想要剖析一个类,必须先要获得该类的字节码文件对象
  • 而剖析使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象

2.2 反射的三种方式

  • 全类名 = 包名.类名
    • Class.forName(“全类名”)
  • 编译期
    • 类名.class
  • 运行期
    • 实例.getClass()

2.3 三种方式演示

/**
 * 获取Class对象的三种方式
 * 先在com.bean包中创建一个User类(测试)
 */
public class Demo01 {
    public static void main(String[] args) throws Exception {
        //只知道包名+类名,可以获取到User对应的Class对象
        Class<?> clazz01 = Class.forName("com.bean.User");
        //编译期,已经有了Class对象
        Class clazz02 = User.class;
        //运行时
        User user = new User();
        Class<? extends User> clazz03 = user.getClass();
        //clazz01、clazz02、clazz03有什么特点?
        System.out.println(clazz01 == clazz02);
        System.out.println(clazz02 == clazz03);
        System.out.println(clazz01 == clazz03);
    }
}
//clazz01、clazz02、clazz03是同一个对象,即同一个类的Class对象(又叫运行时对象/字节码文件对象)!!
/**
 * 运行结果
 * true
 * true
 * true
 */

你可能感兴趣的:(【JAVA面向对象】认识反射机制(一))