Получение ошибки "Несовместимое магическое значение" 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 ответа

Я неправильно думал об этой проблеме и, вероятно, разместил неверный вопрос. Я исходил из предположения, что мне нужно скомпилировать свой собственный файл 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);`

Более вероятно, что вы скачали поврежденный файл.class. Возможно, вы захотите выяснить, сможете ли вы найти где-нибудь нужный файл. Если это невозможно, вы можете снова перекомпилировать исходный код, если он у вас есть.

Даже если вам удастся правильно записать магическое значение в файл, сам файл все еще может содержать (неработающий) тарабарщину.

Другие вопросы по тегам