Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / ClassLoader не грузит классы / 3 сообщений из 3, страница 1 из 1
10.10.2016, 11:05
    #39323628
Timein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ClassLoader не грузит классы
Добрый день. Помогите, пожалуйста. Не могу понять, почему не грузятся классы из указанной класслоадеру папки:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
package com.company;


import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Arrays;

public class ClassManager {
    private final String classDir;

    public ClassManager(String classDir) {
        this.classDir = classDir;
    }

    public MyClass load(String classDirName, String className) {
        URL[] urls = new URL[0];
        File file = new File(classDir + "/" + classDirName);

        try {
            URL url = file.toURI().toURL();
            urls = new URL[]{url};
            System.out.println(Arrays.toString(urls));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        URLClassLoader loader = new URLClassLoader(urls, getClass().getClassLoader()) {
            @Override
            public Class<?> loadClass(String name) throws ClassNotFoundException {
                System.out.println(name);

                Class<?> clazz = null;
                if (name.startsWith("com.company") || name.startsWith("java")) clazz = super.loadClass(name);
                try {
                    if (clazz == null) clazz = findClass(name);
                } catch (ClassNotFoundException e) {
                    clazz = super.loadClass(name);
                }
                return clazz;
            }

        };

        try {
            return (MyClass) loader.loadClass(className).newInstance();
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
package com.company;

public class Main {

    public static void main(String[] args) {
        ClassManager pm = new ClassManager("E:/test");
        pm.load("class1", "myCls");
        pm.load("class2", "myCls");
    }
}



MyClass - это интерфейс, в котором единственный метод, который печатает класс-загрузчик.

В папке E:/test лежит 2 папки class1 и class2, внутри которых класс myCls.java


Среда выдает:
java.lang.ClassNotFoundException: myCls
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at com.company.ClassManager$1.loadClass(ClassManager.java:42)
at com.company.ClassManager.load(ClassManager.java:50)
at com.company.Main.main(Main.java:7)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

java.lang.ClassNotFoundException: myCls
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at com.company.ClassManager$1.loadClass(ClassManager.java:42)
at com.company.ClassManager.load(ClassManager.java:50)
at com.company.Main.main(Main.java:8)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
...
Рейтинг: 0 / 0
10.10.2016, 12:07
    #39323666
Andrew1411
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ClassLoader не грузит классы
TimeinДобрый день. Помогите, пожалуйста. Не могу понять, почему не грузятся классы из указанной класслоадеру папки:

В папке E:/test лежит 2 папки class1 и class2, внутри которых класс myCls.java



... внутри которых должен лежать файл myCls.class
...
Рейтинг: 0 / 0
10.10.2016, 18:39
    #39323975
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ClassLoader не грузит классы
Код: sql
1.
2.
package пакет;
class Класс

означает, что будет:
Код: plaintext
база/пакет/Класс.class
Загрузчик классов отвечает только за поиск "базы". Структура каталогов относительно базы - жёстко фиксирована.

P.S. Задлянафига вообще загрузчик пишется? Штатный чем не устроил?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / ClassLoader не грузит классы / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]