Java 常量池详解之class文件常量池 和class运行时常量池

Java 常量池详解之class文件常量池 和class运行时常量池

在Java中,常量池是指在编译阶段确定的一些数据,这些数据包括了代码中用到的字符串、数字等等。在程序运行的时候,这些常量会被加载到JVM的内存中进行使用。Java中的常量池主要包括class文件常量池和class运行时常量池两种。

class文件常量池

class文件常量池是指,编译期间生成的.class文件中记录的所有常量的表格形式的容器。class文件常量池是class文件的一部分,其中记录了编译后生成的字节码文件中所引用的各种常量、各种类型的符号引用和一些字节码指令。它可以看作是在编译时将各种符号和常量“映射”到常量池中。

例如,下面是一个Java代码示例:

public class MyClass {
    public static final String MY_CONSTANT = "constant value";
}

编译后的.class文件会包含对MY_CONSTANT常量的引用,在class文件常量池中的记录如下:

[CONSTANT_UTF8, constant value]
[CONSTANT_CLASS, MyClass]
[CONSTANT_FIELDREF, MyClass.MY_CONSTANT]

其中,CONSTANT_UTF8表示常量的类型,第二个元素是存储的常量值;CONSTANT_CLASS表示类的类型,第二个元素是类名;CONSTANT_FIELDREF表示字段的类型,第二个元素是字段所在的类名和字段名。

class运行时常量池

在类加载的时候,class文件常量池中的内容会被加载到JVM的内存中生成class运行时常量池,用于存储当前类和其父类的各种常量、符号引用等信息。class运行时常量池包括两类常量:字面量和符号引用。

字面量包括字符串、数字和布尔类型等常量。例如,下面是一个Java代码示例:

public class MyClass {
    String a = "hello";
    int b = 3;
    double c = 3.14;
    boolean d = true;
}

在class运行时常量池中的记录如下:

[CONSTANT_UTF8, hello]
[CONSTANT_UTF8, a]
[CONSTANT_UTF8, Ljava/lang/String;]
[CONSTANT_UTF8, b]
[CONSTANT_UTF8, I]
[CONSTANT_UTF8, c]
[CONSTANT_UTF8, D]
[CONSTANT_UTF8, d]
[CONSTANT_UTF8, Z]
[CONSTANT_CLASS, MyClass]
[CONSTANT_DOUBLE, 3.14]
[CONSTANT_INTEGER, 3]
[CONSTANT_UTF8, <init>]
[CONSTANT_UTF8, ()V]
[CONSTANT_METHODREF, MyClass.<init>]
[CONSTANT_UTF8, Code]
[CONSTANT_NAMEANDTYPE, a, Ljava/lang/String;]
[CONSTANT_NAMEANDTYPE, b, I]
[CONSTANT_NAMEANDTYPE, c, D]
[CONSTANT_NAMEANDTYPE, d, Z]

其中,CONSTANT_DOUBLE和CONSTANT_INTEGER表明了数字类型,第二个元素是具体的数值。CONSTANT_METHODREF表示方法引用,第二个元素是方法所在的类名和方法名。CONSTANT_NAMEANDTYPE表示字段名和字段类型。

符号引用包括类、字段和方法三种。例如,下面是一个Java代码示例:

public class MyClass {
    static final String MY_CONSTANT = "constant value";
    int a = MyClass.MY_CONSTANT.length();
    void b(MyClass myClass) {
        String s = myClass.a;
    }
}

在class运行时常量池中的记录如下:

[CONSTANT_UTF8, constant value]
[CONSTANT_UTF8, MY_CONSTANT]
[CONSTANT_UTF8, Ljava/lang/String;]
[CONSTANT_FIELDREF, MyClass.MY_CONSTANT]
[CONSTANT_UTF8, a]
[CONSTANT_UTF8, I]
[CONSTANT_UTF8, <init>]
[CONSTANT_UTF8, ()V]
[CONSTANT_METHODREF, MyClass.<init>]
[CONSTANT_UTF8, b]
[CONSTANT_UTF8, (LMyClass;)V]
[CONSTANT_UTF8, s]
[CONSTANT_NAMEANDTYPE, <init>, ()V]
[CONSTANT_UTF8, Code]
[CONSTANT_NAMEANDTYPE, length, ()I]
[CONSTANT_NAMEANDTYPE, a, Ljava/lang/String;]
[CONSTANT_METHODREF, java/lang/String.length]
[CONSTANT_FIELDREF, MyClass.a]
[CONSTANT_NAMEANDTYPE, b, (LMyClass;)V]

其中,CONSTANT_FIELDREF和CONSTANT_METHODREF表示字段和方法引用,第二个元素是字段或方法所在的类名和字段或方法名。

以上是Java 常量池详解之class文件常量池 和class运行时常量池的全部内容。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 常量池详解之class文件常量池 和class运行时常量池 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Maven如何打入依赖中指定的部分jar包

    Maven是一款常用的Java项目管理工具,能够自动化地完成项目构建、依赖管理等任务。有时候我们需要将一些指定的jar包打入到我们的项目中,这里将介绍如何使用Maven来实现这个功能。 步骤1:修改pom.xml文件 在Maven中,我们可以通过修改项目的pom.xml文件来指定要打入项目的jar包。以将“mysql-connector-java”这个jar…

    Java 2023年5月19日
    00
  • 多种方法实现当jsp页面完全加载完成后执行一个js函数

    实现当JSP页面完全加载完成后执行一个JS函数,可以通过以下两种方法实现: 方法一:window.onload 在window对象上添加onload事件处理程序,当JSP页面全部加载完成后就会执行该处理程序。在该处理程序中可以调用JS函数。 <script> window.onload = function() { myFunction(); }…

    Java 2023年6月15日
    00
  • 常见的线程池有哪些?

    让我来为你详细讲解如何回答这个问题。 1. 什么是线程池? 线程池是线程的容器,用于维护和复用线程,从而提高应用程序的性能和资源利用率。线程池通常会维护一组工作线程,每个线程都可以从线程池中获取一个任务并执行。 2. 常见的线程池有哪些? 常见的线程池有以下几种: 2.1. 固定大小线程池 固定大小线程池是指线程池中的线程数是固定的,当线程池中的线程都处于运…

    Java 2023年5月10日
    00
  • springboot-mybatis/JPA流式查询的多种实现方式

    针对这个问题,我准备分为以下几个部分进行讲解。 1. 概述 在实际的开发过程中,通常需要处理大量的数据,如果使用传统的查询方式一次性将数据全部查出,可能会导致内存溢出等问题,而流式查询则可以一边查询,一边处理数据,从而避免这些问题。而在 Spring Boot 中,我们常用的流式查询方式有两种:MyBatis 和 JPA。 2. MyBatis 实现流式查询…

    Java 2023年5月20日
    00
  • Jsp真分页实例—分页

    JSP真分页实现需要使用Java语言和JSP技术。具体实现步骤如下: 步骤一:获取数据并计算总页数 首先,我们需要从数据库或后台获取数据并计算出总页数。我们可以通过以下代码实现: <% // 每页显示10条数据 int pageSize = 10; // 当前页码 int currentPage = Integer.parseInt(request.g…

    Java 2023年6月15日
    00
  • 详解Spring依赖注入的三种方式使用及优缺点

    以下是详解Spring依赖注入的三种方式使用及优缺点的完整攻略: 1. Spring依赖注入的三种方式 Spring提供了三种方式来实现依赖注入: 1.1 构造器注入 构造器注入是在对象创建的时候使用构造函数来进行注入。在XML配置文件中,我们可以使用标签对构造函数中需要的参数进行赋值。使用构造器注入的优点是在对象创建时就可以将所有的依赖注入,避免了后期在运…

    Java 2023年5月19日
    00
  • SpringMVC+Shiro的基本使用及功能介绍

    SpringMVC+Shiro的基本使用及功能介绍 什么是Shiro Shiro是一个强大且易于使用的Java安全框架,它提供了身份验证、授权、加密、会话管理等功能,可以帮助我们快速构建安全的Web应用程序。 SpringMVC集成Shiro SpringMVC集成Shiro可以帮助我们快速构建安全的Web应用程序。以下是SpringMVC集成Shiro的基…

    Java 2023年5月17日
    00
  • 解析Spring Mvc Long类型精度丢失问题

    引言 在Spring Mvc中,我们常常遇到处理Long类型数据的问题。但是在处理过程中,会发现有时候Long类型数据的精度会出现丢失的问题。本文将介绍如何解析Spring Mvc处理Long类型精度丢失问题,希望对大家有所帮助。 问题的根源 在Spring Mvc中,当处理Long类型数据时,会自动将字符串类型的参数转换为Long类型。但是在处理过程中,由…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部