Java中Class对象详解

文章详细介绍了Java中的Class对象,包括其在程序运行过程中的生成和加载机制,以及三种获取Class对象的方式:类名.class、Class.forName()和实例对象的getClass()方法。Class对象在内存中的加载会触发类的初始化,如执行静态代码块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Class类是我们再熟悉不过的东西,但是对于Class对象,很多人却是一脸懵逼。

一个Java文件到运行经过的步骤,Class对象的来源

Java程序从源文件创建到程序运行要经过两大步骤:

1、javac编译器将源文件编译为class字节码;

2、java命令启动jvm运行解释class字节码。


 

1. Class对象

在Java中有两种对象:Class对象和实例对象,实例对象是类的实例,通常是通过new关键字构建的。Class对象是JVM生成用来保存对象的类的信息的。Java程序执行之前需要经过编译、加载、链接和初始化这几个阶段,编译阶段会将源码文件编译为.class字节码文件,编译器同时会在.class文件中生成Class对象,加载阶段通过JVM内部的类加载机制,将Class对象加载到内存中。在创建对象实例之前,JVM会先检查Class对象是否在内存中存在,如果不存在,则加载Class对象,然后再创建对象实例,如果存在,则直接根据Class对象创建对象实例。JVM中只有一个Class对象,但可以根据Class对象生成多个对象实例。

2. Class对象的获得

2.1 类名.class

当执行类名.class时,JVM会先检查Class对象是否装入内存,如果没有装入内存,则将Class对象装入内存,然后返回Class对象,如果装入内存,则直接返回Class对象。在加载Class对象后,不会对Class对象进行初始化。

  • Example

public class Test {
    
    static {
        System.out.println("Run static initialization block.");
    }
    
    {
        System.out.println("Run nonstatic initialization block.");
    }
}

public class ClassTest {
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        Class t = Test.class;
    }
}
  • Result

// 空

2.2 Class.forName()

当执行Class.forName()时,JVM也会先检查Class对象是否装入内存,如果没有装入内存,则将Class对象装入内存,然后返回Class对象,如果装入内存,则直接返回Class对象。在加载Class对象后,会对类进行初始化,即执行类的静态代码块。forName()方法中的参数是类名字符串,类名字符串 = 包名 + 类名。Class.forName()的一个很常见的用法是在加载数据库驱动的时候。

  • Example

package com.tyan.test;

public class Test {
    
    static {
        System.out.println("Run static initialization block.");
    }
    
    {
        System.out.println("Run nonstatic initialization block.");
    }
}


package com.tyan.test;

public class ClassTest {
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            Class t = Class.forName("com.tyan.test.Test");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
  • Result

Run static initialization block.

2.3 getClass()

getClass()方法的方法是在通过的类的实例调用的,即已经创建了类的实例。

  • Example

public class Test {
    
    static {
        System.out.println("Run static initialization block.");
    }
    
    {
        System.out.println("Run nonstatic initialization block.");
    }
}

public class ClassTest {
    
    public static void main(String[] args) {
        Test t = new Test();
        Class test = t.getClass();
    }
}
  • Result

Run static initialization block.
Run nonstatic initialization block.


Java Class对象简单的解释 - 简书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值