Почему магические значения 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".