适用于每个 JVM 的最小 Java 类文件是什么?
-
21-12-2019 - |
题
我想要对一系列 JVM 进行一种最小的“冒烟测试”,范围包括 JDK 1 - 8、OpenJDK、IBM JDK,如果可能的话甚至是 Microsoft JDK。有没有办法制作一个最小的 Java 类文件来测试这个?
更新
应该可以运行:
java -cp 类名
并具有确认 JVM 正常运行的输出。
另外,对于那些认为 JVM 始终正常运行的人应该知道,我使用的系统在一台计算机上最多有 20 个 JVM,并且某些 JVM 可能会损坏。另请注意,并非所有 JVM 都可以运行所有 .class 文件
解决方案
krakatau有一个示例电子表文件用于最小的classfile。
.class public minimal
.super java/lang/Object
.
这将为您提供将在JVM中加载的最简单可能的类文件。它没有您通常来自其他工具的所有可选元数据(例如,jasmin始终添加sourcefile属性)。这不是最短的文件,因为你可以通过缩短类名来刮掉几个字节,但基本上是最简单的类。
请注意,虽然此类将加载,但它不包含任何代码,因此您无法有意义地执行它。如果您希望您可以运行的东西作为入口点,则需要添加一个主要功能。这可以通过调整 hello world 删除打印代码。
.class public Code
.super java/lang/Object
.method public static main : ([Ljava/lang/String;)V
.limit stack 10
.limit locals 10
return
.end method
.
这将为您提供一个可运行的类,并立即返回。因此,它是具有主要功能的最简单的类。
其他提示
这 Java 兼容性工具包 (JCK) 正是为此目的而开发的。最小的 jar 不足以检查 JVM 实现的正确性,因为需要涵盖许多极端情况,并且需要支持字节码指令的任何组合。
如果您只是想检查一个最小程序是否运行,请编译一个带有空的简单类 main
版本 1 中转换为 Java 类文件格式的方法。由于 Java 的向后兼容性,任何 JVM 都应该可以理解这一点,并且 JVM 应该以状态代码退出 0
.
具有主要方法的任何类都可以在任何JVM上执行,这可以是测试的最小案例,例如,例如:
class Hello {
public static void main (String args[])
{
System.out.println("hello");
}
}
.