0
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic 
value 813187905 in class file

我理解错误,因为它很清楚。我需要以某种方式将 java 的魔法值0xCAFEBABE(十六进制)写入我首先以编程方式编写的 .java 文件。我已经阅读了类似问题的所有答案,但它们都指向引入 3rd 方库以编程方式编写 java 文件。

我不禁认为在不引入 3rd 方库的情况下有一个相对直接的解决方案?如何将十六进制值写入任意文件?

现在,我正在拿一根绳子。将其转换为字节,然后将这些字节写入 aFileInputStream然后转储到具有 .java 扩展名的文件中。我正在使用的代码如下。我怎样才能不写字节,而是写十六进制值?编码不是我的强项,所以这个问题真的给我带来了一些麻烦。

我用来编写我的 java 文件的代码:

public void writeJavaFile() throws IOException 
{
    String testString = "class test { public test() {} public void printTest()
    { System.out.println(\"yoooo\");}}";
    String filename = "test.java";
    OutputStream outputStream = new FileOutputStream(filename);
    outputStream.write(testString.getBytes());
    outputStream.flush();
    outputStream.close();
}
4

2 回答 2

0

我在想这个问题都错了,因此可能发布了一个错位的问题。我假设我需要将自己的 java 文件编译为类文件,这是实际写入魔法值的地方。

显然,我可以让 java 的编译器编译我以编程方式编写的 java 文件。这是我用来让它工作的代码:

   `CustomClassLoader classLoader = new CustomClassLoader();
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    int result = compiler.run(null,null,null, "test.java");
    System.out.println("Result: " + result);
    if (result != 0) {
       System.out.println("Error compiling class!!");
       return;
    }
    // Read in newly compiled class file
    Path path = Paths.get("test.class");
    byte[] bytes = Files.readAllBytes(path);
    // Load class into JVM
    Class myClass = classLoader.loadClazz(bytes);`
于 2020-03-09T17:18:21.060 回答
-1

您更有可能下​​载了损坏的 .class 文件。您可能想知道是否可以在某处找到正确的文件。如果那是不可能的,您可以重新编译源代码(如果有的话)。

即使您设法将魔术值正确写入文件,文件本身仍可能包含(无法运行的)乱码。

于 2020-03-09T16:41:21.033 回答