Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > ClassLoader


Автор: endryha 25.3.2008, 18:27
Нужно написать клас лоадер который бы загружал класы из указанной директории
Вот мой клас лоадер...
Код

public class PathClassLoaderClass extends ClassLoader {
    private String path;

    public PathClassLoaderClass() {
    }

    @Override
    protected Class findClass(String className) throws ClassNotFoundException {
        try {
            byte[] bytes = getBinaryClass(className);
            Class result = defineClass(className, bytes, 0, bytes.length);
            return result;
        } catch (IOException e) {
            throw new ClassNotFoundException();
        }
    }

    private byte[] getBinaryClass(String className)
            throws ClassNotFoundException, IOException {
        FileInputStream in = null;
        try {
            String fname = getPath() + File.separator + className + ".class";
            File classFile = new File(fname);
            System.out.println(fname);
            if (!classFile.exists()) {
                throw new ClassNotFoundException();
            }
            in = new FileInputStream(classFile);
            byte[] bytes = new byte[in.available()];
            System.out.println(bytes.length);
            in.read(bytes);
            return bytes;
        } finally {
            if (in != null) {
                in.close();
            }
        }
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        if (path == null) {
            throw new NullPointerException();
        }
        this.path = path;
    }
}

Выдает ошибку при вызове defineClass() хотя масив байто класа я получаю...
Что я делаю не так?

Автор: Kangaroo 25.3.2008, 18:42
Цитата(endryha @  25.3.2008,  17:27 Найти цитируемый пост)
Выдает ошибку при вызове defineClass() хотя масив байто класа я получаю...

А что за ошибка?

Автор: endryha 25.3.2008, 18:48
Вот как я вызываю:
Код

public static void main(String[] args) {
        PathClassLoaderClass loader = new PathClassLoaderClass();
        loader.setPath("C:" + File.separator + "TEMP");
        Class clazz = null;
        try {
            clazz = loader.loadClass("App");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println(clazz.getName());
    }


Ошибка:
Код

Exception in thread "main" java.lang.NoClassDefFoundError: App (wrong name: Lab3/App)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at Lab8.PathClassLoaderClass.findClass(PathClassLoaderClass.java:21)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at Lab8.App.main(App.java:16)

Автор: Kangaroo 25.3.2008, 20:32
Цитата(endryha @  25.3.2008,  17:48 Найти цитируемый пост)
(wrong name: Lab3/App)

Может нужно полный путь указывать? С пекеджем?

Автор: endryha 26.3.2008, 11:35
Всеравно почемуто ищет только в класпас а не там где я укажу...

Автор: LSD 26.3.2008, 15:50
Ошибка из-за пакаджа. Ты пытаешься загрузить класс App, а в том .class файле, что ты подсунул загрузчику находится класс Lab3.App. Ты или указывай загрузчику (defineClass()) полное имя класса Lab3.App или не указывай вообще никакого (по моему он может и без него обойтись).

Автор: endryha 27.3.2008, 18:48
Ты прав ) Спасибо за ответы

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)