有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

文件io获取“不兼容的魔术值”错误Java

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

我理解这个错误,因为它很清楚。我需要以某种方式获得java的神奇值,0xCAFEBABE(十六进制)写入到。我首先以编程方式编写的java文件。我已经阅读了类似问题的所有答案,但它们都指向引入第三方库以编程方式编写java文件

我忍不住认为有一个相对直接的解决方案,而不引入第三方库?如何将十六进制值写入任意文件

现在,我拿着一根绳子。将其转换为字节,然后将这些字节写入FileInputStream,然后将其转储到具有的文件中。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();
}

共 (2) 个答案

  1. # 1 楼答案

    我对这个问题的想法完全错误,因此可能发布了一个不一致的问题。我假设我需要将自己的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);`
    
  2. # 2 楼答案

    更有可能是您下载的文件已损坏。类文件。您可能想知道是否可以在某处找到正确的文件。如果这是不可能的,您可以重新编译源代码,如果您有它

    即使您成功地将魔法值正确写入文件,文件本身也可能包含(无法命名)胡言乱语