📜  Java类文件

📅  最后修改于: 2022-05-13 01:54:26.942000             🧑  作者: Mango

Java类文件

Java类文件是包含Java字节码并具有.class 扩展名的文件,可以由 JVM 执行。 Java类文件由Java编译器从. Java文件作为编译成功的结果。正如我们所知,单个Java编程语言源文件(或者我们可以说Java文件)可能包含一个类或多个类。所以如果一个. Java文件有多个类,那么每个类都会编译成一个单独的类文件。
例如:将下面的代码保存为测试。你的系统上的Java

// Compiling this Java program would
// result in multiple class files.
  
class Sample
{
  
}
  
// Class Declaration
class Student
{
  
}
// Class Declaration
class Test
{
       public static void main(String[] args)   
       {
           System.out.println("Class File Structure");
       }
} 

编译:

编译后在对应的文件夹中会有3个类文件,命名为:

  • 样本.class
  • 学生类
  • 测试类

单个类文件结构包含描述类文件的属性。
类文件结构的表示

ClassFile 
{
     magic_number;
     minor_version;
     major_version;
     constant_pool_count;
     constant_pool[];
     access_flags;
     this_class;
     super_class;
     interfaces_count;
     interfaces[];
     fields_count;
     fields[];
     methods_count;
     methods[];
     attributes_count;
     attributes[];
}

类文件的元素如下:

  1. magic_number: class文件的前4个字节称为magic_number。这是 JVM 用来识别.class文件是否由有效编译器生成的预定义值。预定义值将采用十六进制形式,即0xCAFEBABE
    现在让我们看看当 JVM 找不到有效的幻数时会发生什么。假设我们有一个.名为Java的文件。 Java如下,并按照您的系统上的分步过程进行操作。
    // class Declaration
    class Sample
    {
       public static void main(String[] args)
       {
           System.out.println("Magic Number");           
       }
    }
    

    第 1 步:使用 javac 示例编译。Java
    第 2 步:现在打开 Sample.class 文件。它看起来像以下。

    Sample.class 文件

    第 3 步:现在从文件开头擦除此Sample.class文件中的至少一个符号并保存。
    第 4 步:现在尝试使用Java Sample 命令运行它并查看神奇之处,即您将获得运行时异常(请参见下图中突出显示的文本):
    由于无效的幻数导致的运行时异常

    注意:这取决于您删除.class文件数据的程度。

  2. 次要版本和主要版本:这两者一起代表.class文件版本。 JVM 将使用这些版本来识别编译器的哪个版本生成当前的 .class 文件。我们将类文件的版本表示为 Mm,其中 M 代表 major_version,m 代表 minor_version

    注意:低版本编译器生成的.class文件可以被高版本JVM执行,但是高版本编译器生成的.class文件不能被低版本JVM执行。如果我们尝试执行,我们将得到运行时异常。

    此演示适用于 Windows 操作系统,如下所示:

    步骤 1:打开命令提示符窗口并尝试分别使用以下命令检查Java编译器版本和 JVM 版本(图像中突出显示的文本是命令)
    1.8 版本的输出将是:
    Java 编译器版本
    JVM版本

    第 2 步:现在检查可能高于或低于已安装的另一个版本。此下载链接。
    并将其安装到您的 PC 或笔记本电脑上,并记下安装地址。
    第 3 步:打开第二个命令提示符窗口并设置在第 2 步中安装的已安装 jdk 的 bin 文件夹的路径。并检查Java编译器版本和 JVM 版本。
    检查JDK 1.6的版本
    第 4 步:现在在第一个命令提示符下编译任何有效的. Java文件。例如:参见上面的示例。 Java文件。编译为:
    使用编译器版本 1.8 进行编译
    第 5 步:现在在第二个命令提示符窗口尝试运行上面编译的代码类文件,看看会发生什么。我在下图中突出显示了一个运行时异常。

    由于类文件的主要和次要版本无效导致运行时异常

    注意:内部jdk 1.5版本表示49.0,1.6表示50.0,1.7表示51.0等类文件版本,其中小数点前的数字代表major_version,小数点后的数字代表minor_version。

    1. constant_pool_count:表示常量池中存在的常量的个数(编译Java文件时,所有对变量和方法的引用都作为符号引用存储在类的常量池中)
    2. constant_pool[]:表示常量池文件中存在的常量信息。
    3. access_flags:它提供有关声明到类文件的修饰符的信息。
    4. this_class:它代表类文件的完全限定名。
    5. super_class:它代表当前类的直接超类的完全限定名。考虑上面的示例。 Java文件。当我们编译它时,我们可以说this_class将是Sample 类super_class将是Object 类。
    6. interface_count:返回当前类文件实现的接口数量。
    7. interface[]:返回当前类文件实现的接口信息。
    8. fields_count:它表示当前类文件中存在的字段(静态变量)的数量。
    9. fields[]:它表示当前类文件中存在的字段(静态变量)信息。
    10. method_count:它表示当前类文件中存在的方法数。
    11. method[]:它返回有关当前类文件中存在的所有方法的信息。
    12. attributes_count:它返回当前类文件中存在的属性(实例变量)的数量。
    13. attributes[]:它提供有关当前类文件中存在的所有属性的信息。