NoClassDefFoundError on ClassLoader.defineClass (неправильное имя) - PullRequest
2 голосов
/ 29 ноября 2011

У меня есть файл класса, из которого я читаю байты и определяю в объект Class с помощью рефлексивного вызова ClassLoader.defineClass.

Получаемое сообщение NoClassDefFoundError:

Caused by: java.lang.NoClassDefFoundError: com/foo/sub/Foo (wrong name: com.foo.sub.Foo)

Файл класса был скомпилирован с пакетом "com.foo.sub", поэтому полное имя класса будет "com.foo.sub.Foo"

Вызов defineClass:

byte[] fileBytes;
//... read file
Method defineClass;
//... initialize and prepare Method for reflective call
Class clazz = defineClass.invoke("com.foo.sub.Foo", fileBytes, 0, fileBytes.length);

Состояние javadocs (относительно параметра name defineClass ): " name - ожидаемое имя класса или ноль, если нетизвестно, используя «.»и не '/' как разделитель и без завершающего суффикса .class."

Я не понимаю, почему генерируется исключение и что должно указывать сообщение.Любая помощь приветствуется.

1 Ответ

3 голосов
/ 29 ноября 2011

В соответствии с документацией этого метода , он вызовет NoClassDefFoundError, если вы укажете имя (в вашем случае com.foo.sub.Foo), которое не совпадает с именем, которое класс определяет для себя (внутри)ваш fileBytes).

Чтобы узнать правильное имя, попробуйте что-то вроде

System.out.println(defineClass.invoke(null, fileBytes, 0, fileBytes.length));

(что должно напечатать что-то вроде class com.foo.sub.Foo).

...