美文网首页
Java的Class类讲解之Class对象的产生

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

作者: 小虎哥的技术博客 | 来源:发表于2022-07-27 14:41 被阅读0次

类加载器将字节码文件加载到计算机内存中并产生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("加载这个类");
    }
}
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();
        }
    }
}

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


获得Class对象

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

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

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

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

Class clazz = Student.class;

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

Student s1 = new Student();
Class clazz = s1.getClass();

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


结语

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

关注微信公众号:小虎哥的技术博客,每天一篇文章,让你我都成为更好的自己

相关文章

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

    类加载器将字节码文件加载到计算机内存中并产生Class对象。 了解原理 我们编写的类(Xxx.java)在Java...

  • java 泛型方法的两种写法

    这种需要传入 类名.class(class对象)(java有两类对象,Class对象和实例对象。更多参考Java的...

  • java反射reflect

    Class类 java中类是谁的对象? 类是对象,类是java.lang.Class类的实例对象(there is...

  • 夯实Java基础系列9:深入理解Class类和Object类

    目录 Java中Class类及用法Class类原理如何获得一个Class类对象使用Class类的对象来生成目标类的...

  • 关于反射

    反射原理 “任何类的对象都是Class类的对象”! 在Java中,每个class都有一个相应的Class对象。也...

  • Java反射1

    Class类 类是对象,是java.lang.Class类的实例对象。 Full full1=new Full()...

  • java反射机制

    核心是object类的getclass方法,可以构造java类的.class对象; 该class对象可以获得类的所...

  • java反射

    一、Class类的使用 类是对象,任何一个类都是java.lang.class类的实例对象,这个类,这个实例对象可...

  • JavaExam

    Java基本编译操作 类,对象 类What is a Java class?➢ A template for a ...

  • 详解JVM内存管理与垃圾回收机制3 - JVM中对象的内存布局

    在Java语言层面,可以通过Class类来描述普通的Java类,当JVM创建对象的同时,会生成对应的Class对象...

网友评论

      本文标题:Java的Class类讲解之Class对象的产生

      本文链接:https://www.haomeiwen.com/subject/tajzirtx.html