Получение ошибки "Несовместимое магическое значение" 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. Возможно, вы захотите выяснить, сможете ли вы найти где-нибудь нужный файл. Если это невозможно, вы можете снова перекомпилировать исходный код, если он у вас есть.
Даже если вам удастся правильно записать магическое значение в файл, сам файл все еще может содержать (неработающий) тарабарщину.