Получение ошибки «Несовместимые маги c значение» Java - PullRequest
0 голосов
/ 09 марта 2020
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic 
value 813187905 in class file

Я понимаю ошибку, так как она вполне понятна. Мне нужно каким-то образом получить значение java magi c, 0xCAFEBABE (hex), записанное в файл. 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 ]

0 голосов
/ 09 марта 2020

Я думал об этой проблеме все неправильно и поэтому, вероятно, разместил смещенный вопрос. Я предполагал, что мне нужно скомпилировать свой собственный файл java в файл класса, где фактически записано значение magi c.

Очевидно, что я могу просто заставить компилятор 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);`
0 голосов
/ 09 марта 2020

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

Даже если вам удастся правильно записать значение magi c в файл, сам файл может по-прежнему содержать (неуправляемый) gibberi sh.

...