• Java的Class类讲解之Class对象的产生


    类加载器将字节码文件加载到计算机内存中并产生Class对象。

    了解原理

    我们编写的类(Xxx.java)在Java编译器编译之后转换成字节码文件(Xxx.class),字节码文件是Java虚拟机可以直接读取的文件。

    Java虚拟机是动态的根据需要去加载各个字节码文件(Xxx.class)的,字节码文件只会被加载一次(已经加载到内存就不会再次被加载),加载字节码文件的工作是被一个叫做类加载器玩意来完成的。这个类加载器加载一个类的字节码文件后会生成这个类的Class对象,这个Class对象就负责这个类的所有对象的创建、字段调用、方法调用等工作。(每个类都有一个Class 对象,负责干这些苦活累活。)


    类加载器动态加载

    (类加载器不是一下子将所有的类全部加载到内存中的)。

    类加载器是动态的根据需要去加载各个字节码文件(Xxx.class)的,以下三种方式会触发类加载器去加载类的字节码文件:

    • new 这个类,创建新对象(构造方法其实也是静态方法)
    • 调用这个类的静态字段或方法
    • 手动加载 Class.forName("xxx.Xxx")

    类加载器加载之前会先判断是否已经加载过这个类,如果已经加载过了就不会再次加载!

    public class Student {
        // 静态方法
        public static void print() {
        }
    
        static {
            System.out.println("加载这个类");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    public class Demo {
        public static void main(String[] args) {
            // 第一种 新建对象
            Student s1 = new Student();
    
            // 第二种 调用静态字段或方法
            Student.print();
    
            try {
                // 第三种 手动加载
                Class clazz = Class.forName("lesson09.Student");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    加载的过程会给类的静态(static)字段和方法分配内存空间,所以说static是属于类的,而不属于任何对象。


    获得Class对象

    新建对象和调用类的静态字段和方法虽然可以触发创建Class对象,但是无法拿到Class对象引用,Class.forName(xxx.Xxx)是可以触发创建Class对象,并且会返回Class对象引用。

    我们可以通过Class.forName(类路径)方法获得Class对象
    第一种:

    Class clazz = Class.forName("lesson09.Student");
    
    • 1

    或者类名.class字段获得Class对象
    第二种

    Class clazz = Student.class;
    
    • 1

    或者对象.getClass()获得Class对象
    第三种

    Student s1 = new Student();
    Class clazz = s1.getClass();
    
    • 1
    • 2

    Class.forName(类路径)一定会新建一个Class对象吗?
    不会!如果该类已经被加载过了就不会再次加载,而是直接返回Class对象引用。


    结语

    Class对象的产生清楚了,但是Class对象可以干啥呢?下一篇文章再详细说明。

    关注微信公众号:小虎哥的技术博客,每天一篇文章,让你我都成为更好的自己
    在这里插入图片描述

  • 相关阅读:
    信号与进程间通信
    【栈与队列面试题】用队列实现栈(动图演示)
    MySQL主从配置-之GTID复制【第二篇】
    Keil仿真闪退问题
    【html+css】袁进 渡一
    Himall验证Web帮助类HTML解码
    SpringBoot调用ChatGPT-API实现智能对话
    【BrowserRouter与HashRouter的区别】
    亚马逊,速卖通,敦煌产品测评补单攻略:低成本、高安全实操指南
    IDEA(安装和使用)
  • 原文地址:https://blog.csdn.net/qq_28883885/article/details/126014117