Использование defineClass для динамического создания класса из байтов - PullRequest
1 голос
/ 19 октября 2011

Кажется, что я должен быть в состоянии сделать это с загрузчиком классов, полученным из URLClassLoader, который включает loadClass():

public Class loadClass(String className, byte[] classBytes)
throws ClassNotFoundException, NoClassDefFoundError
{
    Class result = null;

    result = defineClass(className, classBytes, 0, classBytes.length);
    classes.put(className, result);
    return result;
}

Затем я читаю байты из файла класса и вызываю вышеуказанный метод loadClass. Я получаю это:

java.lang.NoClassDefFoundError: com/samples/SampleClass (wrong name: com/samples/SampleClass) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) at java.lang.ClassLoader.defineClass(ClassLoader.java:615) at java.lang.ClassLoader.defineClass(ClassLoader.java:465)

Странно то, что имя и «неправильное имя» совпадают. И оба являются правильным пакетом.

Как можно получить NoClassDefFoundError с правильным ожидаемым именем? И возможно ли это сделать defineClass?

Использование устаревшей формы без имени класса работает отлично:

result = defineClass(classBytes, 0, classBytes.length);

Спасибо

1 Ответ

0 голосов
/ 31 июля 2013

Javadoc: Параметры: name - ожидаемое имя класса или нуль, если он не известен, с использованием '.' а не '/' в качестве разделителя и без завершающего суффикса ".class".

попробуйте заменить "/" на "."

...