Почему магические значения classLoader в defineClass() выдают исключение?

Я хочу написать classLoader, который поможет мне реализовать настраиваемые классы и, в конечном счете, целый компонент во время выполнения. Сейчас я нахожусь в процессе загрузки класса.

Я пытаюсь загрузить этот файл role.java. Однако, когда я доберусь до этой части кода:

myClass = super.defineClass(className, classData, 0, classData.length);

Я получаю это исключение:

Исключение в потоке "main" java.lang.ClassFormatError: Несовместимое магическое значение 1885430635 в файле класса C:\Users\ARIFAH\Downloads\Compressed\eUML2 бесплатная версия \ с кодом classLoader \2\archetypedComponentWithNull\src\aC\Role/java

at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at customCL.customClassLoader.loadClass(customClassLoader.java:116)
at java.lang.ClassLoader.loadClass(Unknown Source)
at customCL.customClassLoader.main(customClassLoader.java:145)

Я читал посты, в которых говорилось: "тебе нужно что-то вроде OSGi". Это было бы похоже на работу над чем-то новым с нуля, чего я бы хотел избежать.

Почему я получаю эту ошибку?

1 ответ

Вы на самом деле не загружаете файл реального класса. Волшебное значение любого допустимого файла класса 0xCAFEBABEи эта магия в гексе 0x7061636B,

Обратите внимание, что если мы конвертируем 0x7061636B в байт ASCII, получается строка "pack". Это означает, что файл, который вы считаете файлом класса, фактически начинается со строки "pack".

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