Java的类文件

作者: Arvin Chen 分类: Java 来源: Break易站(www.breakyizhan.com)

Java的类文件是包含Java字节码和具有文件.class扩展,可以通过执行JVM。作为编译成功的结果,Java类文件由来自.java文件的Java编译器创建。我们知道一个Java编程语言源文件(或者我们可以说.java文件)可能包含一个类或多个类。所以如果一个.java文件有多个类,那么每个类将编译成一个单独的类文件。

例如:在系统上将 下面的代码保存为Test.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");
       }
}

编译:

javac Test.java

编译完成后,相应文件夹中将会有3个类文件,名为:

  • Sample.class
  • Student.class
  • Test.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[];
}

类文件的元素如下所示:

magic_number:类文件的前4个字节被称为magic_number。这是JVM用来识别.class文件是否由有效编译器生成的预定义值。预定义值将采用十六进制形式,即0xCAFEBABE。
现在让我们看看当JVM找不到有效的幻数时会发生什么。假设我们有一个名为Sample.java的.java文件,如下所示,然后按照系统上的分步过程进行操作。

//类声明
class Sample
{
   public static void main(String [] args)
   {
       System.out.println(“Magic Number”);           
   }
}

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

Java的类文件

第3步:现在从文件开始擦除此Sample.class文件中的至少一个符号并保存。
第4步:现在尝试使用java示例命令运行此命令,并看到魔术,即您将得到运行时异常(请参阅下图中突出显示的文本):
Java的类文件

注意:这可能会有所不同,具体取决于您删除.class文件数据的多少。
minor_version&major_version:这两者一起表示.class文件版本。JVM将使用这些版本来确定哪个版本的编译器生成当前的.class文件。我们将类文件的版本表示为Mm,其中M代表major_version,m代表minor_version
注意:较低版本的编译器生成的.class文件可以由高版本的JVM执行,但较高版本的编译器生成的.class文件不能由较低版本的JVM执行。如果我们尝试执行,我们将得到运行时异常。

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

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

Java的类文件

步骤2:现在检查另一个可能比已安装的版本更高或更低的版本。下载链接。
并将其安装到您的PC或便携式计算机上并记下安装地址。
步骤3:打开第二个命令提示符窗口,并设置第二步中安装的已安装jdk的bin文件夹路径。并检查Java编译器版本的广告JVM版本。
Java的类文件
第4步:现在在第1个命令提示符下编译任何有效的.java文件。例如:见上面的Sample.java文件。编译为:
Java的类文件
步骤5:现在在第二个命令提示符窗口中尝试运行上面编译的代码类文件,看看会发生什么。有一个运行时异常,我已经在下图中突出显示。

Java的类文件

注意:内部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:它表示当前类的直接超类的完全限定名。考虑上面的Sample.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 []:它提供有关当前类文件中存在的所有属性的信息。
  •   本文标题:Java的类文件 - Break易站
    转载请保留页面地址:https://www.breakyizhan.com/java/3711.html

    发表笔记

    电子邮件地址不会被公开。 必填项已用*标注

    更多阅读