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");
}
}
编译:
javac Test.java
编译后在对应的文件夹中会有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[];
}
类文件的元素如下:
- 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 文件。它看起来像以下。第 3 步:现在从文件开头擦除此Sample.class文件中的至少一个符号并保存。
第 4 步:现在尝试使用Java Sample 命令运行它并查看神奇之处,即您将获得运行时异常(请参见下图中突出显示的文本):注意:这取决于您删除.class文件数据的程度。
- 次要版本和主要版本:这两者一起代表.class文件版本。 JVM 将使用这些版本来识别编译器的哪个版本生成当前的 .class 文件。我们将类文件的版本表示为 Mm,其中 M 代表 major_version,m 代表 minor_version
注意:低版本编译器生成的.class文件可以被高版本JVM执行,但是高版本编译器生成的.class文件不能被低版本JVM执行。如果我们尝试执行,我们将得到运行时异常。
此演示适用于 Windows 操作系统,如下所示:
步骤 1:打开命令提示符窗口并尝试分别使用以下命令检查Java编译器版本和 JVM 版本(图像中突出显示的文本是命令)
1.8 版本的输出将是:第 2 步:现在检查可能高于或低于已安装的另一个版本。此下载链接。
并将其安装到您的 PC 或笔记本电脑上,并记下安装地址。
第 3 步:打开第二个命令提示符窗口并设置在第 2 步中安装的已安装 jdk 的 bin 文件夹的路径。并检查Java编译器版本和 JVM 版本。
第 4 步:现在在第一个命令提示符下编译任何有效的. Java文件。例如:参见上面的示例。 Java文件。编译为:
第 5 步:现在在第二个命令提示符窗口尝试运行上面编译的代码类文件,看看会发生什么。我在下图中突出显示了一个运行时异常。注意:内部jdk 1.5版本表示49.0,1.6表示50.0,1.7表示51.0等类文件版本,其中小数点前的数字代表major_version,小数点后的数字代表minor_version。
- constant_pool_count:表示常量池中存在的常量的个数(编译Java文件时,所有对变量和方法的引用都作为符号引用存储在类的常量池中) 。
- constant_pool[]:表示常量池文件中存在的常量信息。
- access_flags:它提供有关声明到类文件的修饰符的信息。
- this_class:它代表类文件的完全限定名。
- super_class:它代表当前类的直接超类的完全限定名。考虑上面的示例。 Java文件。当我们编译它时,我们可以说this_class将是Sample 类, super_class将是Object 类。
- interface_count:返回当前类文件实现的接口数量。
- interface[]:返回当前类文件实现的接口信息。
- fields_count:它表示当前类文件中存在的字段(静态变量)的数量。
- fields[]:它表示当前类文件中存在的字段(静态变量)信息。
- method_count:它表示当前类文件中存在的方法数。
- method[]:它返回有关当前类文件中存在的所有方法的信息。
- attributes_count:它返回当前类文件中存在的属性(实例变量)的数量。
- attributes[]:它提供有关当前类文件中存在的所有属性的信息。