Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 16.02.2016
Сообщений: 26

Не могу разобраться что не так я делаю с ClassLoader

19.06.2019, 10:04. Показов 2716. Ответов 13

Студворк — интернет-сервис помощи студентам
Всем привет, помогите пожалуйста разобраться, что я не так сделал, задача такая: Создать наследника класса ClassLoader, который сможет загружать классы не только из classpath, но и из сторонней директории, имя которой передается через функции., я реализовал это все, но запускаю программу в Demo классе, всегда вылетают исключения, то не находит файл в директории, то неправильное имя файла, хотя файл реально есть в директории, пересмотрел уже кучу статей, но так и не смог разобраться.
Код из файлов ниже:

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List;
 
public class MyClassLoader extends ClassLoader {
    private String directory;
    private String extensionOfFile = ".class";
    private String[] nameOfFileStrings;
    private int index;
 
    @Override
    public String getPath() {
        return this.directory;
    }
 
    @Override
    public void setPath(String dir) {
        if (dir == null) {
            throw new NullPointerException();
        }
 
        try {
            this.directory = dir;
        } catch (Exception e) {
            e.printStackTrace();
        }
 
    }
 
    @Override
    protected Class<?> loadClass(String name, boolean resolve)
            throws ClassNotFoundException {
        Class<?> resultClass = findClass(name);
 
        if (resolve) {
            resolveClass(resultClass);
        }
 
        return resultClass;
    }
 
    @Override
    public Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] temp;
 
        File file = new File(name);
 
        try {
            temp = loadFileAsBytes(file);
            return defineClass(name, temp, 0, temp.length);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
 
    private byte[] loadFileAsBytes(File file) throws FileNotFoundException {
 
        byte[] result = new byte[(int) file.length()];
 
        FileInputStream fis = new FileInputStream(file);
 
        try {
            fis.read(result, 0, result.length);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fis.close();
            } catch (Exception e) {
            }
        }
        return result;
    }
 
    // get 1 file's name from array of names
    public String getNameOfFile(String path) {
        nameOfFileStrings = findFiles(path, extensionOfFile);
        String nameString = "";
 
        if (index < nameOfFileStrings.length) {
            nameString = nameOfFileStrings[index++];
        } else {
            index = 0;
        }
 
        String[] wordsStrings = nameString.split("/");
        String nameString2 = wordsStrings[wordsStrings.length - 1];
        String[] nameString3 = nameString2.split("\\.");
        String nameOfOurFile = nameString3[0];
 
        return nameString;
    }
 
    // find all files in directory with extension which we want
    private String[] findFiles(String dir, String extension) {
        if (dir == null) {
            throw new NullPointerException();
        }
 
        if ("".equals(dir)) {
            throw new IllegalArgumentException();
        }
 
        if ("".equals(extension)) {
            String[] clearStringsArray = new String[0];
            return clearStringsArray;
        }
 
        MyFileVisitor myFileVisitor = new MyFileVisitor();
 
        try {
            Files.walkFileTree(Paths.get(dir), myFileVisitor);
        } catch (IOException e) {
            throw new IllegalArgumentException();
        }
 
        if (extension == null) {
            return myFileVisitor.arr;
        }
 
        List<String> defList = new ArrayList<String>();
 
        for (int i = 0; i < myFileVisitor.arr.length; i++) {
            if (myFileVisitor.arr[i].contains(extension)) {
                defList.add(myFileVisitor.arr[i]);
            }
        }
 
        String[] defStrings = new String[defList.size()];
        int k = 0;
 
        for (String str : defList) {
            defStrings[k++] = str;
        }
 
        return defStrings;
    }
 
    private class MyFileVisitor extends SimpleFileVisitor<Path> {
        java.util.List<String> filePaths = new ArrayList<String>();
        String arr[] = {};
 
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                throws IOException {
            {
                filePaths.add(file.toString());
 
                arr = new String[filePaths.size()];
 
                int k = 0;
 
                for (String str : filePaths) {
                    arr[k++] = str;
                }
 
                return FileVisitResult.CONTINUE;
            }
 
        }
    }
 
}
Java
1
2
3
4
5
6
7
8
9
10
public class DemoLoader {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        String dirName = "/home/user/Documents/Test/";
        MyClassLoader myClassLoader = new MyClassLoader();
        myClassLoader.setPath(dirName);
        Class<?> clazz = myClassLoader.findClass(myClassLoader.getNameOfFile(myClassLoader.getPath()));
        Object object = clazz.newInstance();
        System.out.println(object);
    }
}
Java
1
2
3
4
5
public class Test{
    public static void main(String[] args) {
        System.out.println("Hello world from the loaded class !!!");
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.06.2019, 10:04
Ответы с готовыми решениями:

не могу разобраться что делаю не так!
скомпилировал файл, а запустить не могу! чего не хватает!!

Пытаюсь разобраться T-sql, подскажите что я делаю не так
Выполняю задание и не могу понять, как делать 8 пункт и что от меня хотят в пятом Подскажите плиз может что не так я делаю, не прошу за...

Не могу понять, что я делаю не так
Написать подпрограмму, которая в строке символов удаляет из каждой группы идущих подряд цифр, в которой более двух цифр и которой...

13
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
19.06.2019, 10:39
Wnmaster88, во-первых покажи ошибку.
Во-вторых код написал мягко сказать хреново.
Прежде чем грузить класс, надо узнать не может ли он быть загружен кем то из родителей
NPE не кидай никогда
С исключениями надо что-то делать кроме того чтобы их просто писать и проглатывать.
Писание класс лоадеров пордазумевает некий уровень понимания что ты делаешь и общий опыт. Похоже это не твой случай.
1
0 / 0 / 0
Регистрация: 16.02.2016
Сообщений: 26
19.06.2019, 10:47  [ТС]
Вот код ошибки, это если полный путь передавать:

Java
1
2
3
4
5
6
7
8
Exception in thread "main" java.lang.NoClassDefFoundError: IllegalName: /home/user/Documents/Test/Test.class
    at java.lang.ClassLoader.preDefineClass(ClassLoader.java:654)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:761)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:642)
    at laba8.MyClassLoader.findClass(MyClassLoader.java:63)
    at laba8.MyClassLoader.loadClass(MyClassLoader.java:46)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at laba8.DemoLoader.main(DemoLoader.java:8)
Вот код ошибки, это если передавать только имя класса:

Java
1
2
3
4
5
6
7
8
9
java.io.FileNotFoundException: Test (No such file or directory)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at laba8.MyClassLoader.loadFileAsBytes(MyClassLoader.java:116)
    at laba8.MyClassLoader.findClass(MyClassLoader.java:62)
    at laba8.DemoLoader.main(DemoLoader.java:8)
Exception in thread "main" java.lang.NullPointerException
    at laba8.DemoLoader.main(DemoLoader.java:9)
По поводу того, что код плохой, я не спорю, плохой, но я только учусь, а с ClassLoader'ор столкнулся впервые.
0
Заблокирован
19.06.2019, 11:04
Wnmaster88, а вот так не проще?
Java
1
ClassLoader.getSystemClassLoader().loadClass()....
Добавлено через 8 минут
Wnmaster88, есть еще URLClassLoader, он может грузить по адресу класс.
0
0 / 0 / 0
Регистрация: 16.02.2016
Сообщений: 26
19.06.2019, 11:13  [ТС]
Возможно как ВЫ пишите так и проще или использовать URLClassLoader, но я думаю, что если я так буду это делать, то тесты по задаче не пройдут, нужно делать строго по условию.
0
Заблокирован
19.06.2019, 11:57
Wnmaster88, а какая задача(цель) у вашей программы?
0
0 / 0 / 0
Регистрация: 16.02.2016
Сообщений: 26
19.06.2019, 12:00  [ТС]
Задача: Создать наследника класса ClassLoader, который сможет загружать классы не только из classpath, но и из сторонней директории, имя которой передается через функции.
0
Заблокирован
19.06.2019, 12:00
Wnmaster88, как я понял, вам надо загружать классы из определенной папки?
0
19.06.2019, 12:01

Не по теме:

del

1
Заблокирован
19.06.2019, 12:14
Wnmaster88, с помощью URLClassLoader это можно сделать. Я уже говорил об этом. Какой смысл новый класс делать и наследовать его, делая много лишнего кода? Цель данного действия скажите. Если цели нет, то и задача будет считаться нецелесообразной, а если нет цели у нее, то и помогать вам смысла не вижу. Извините за прямоту, просто хочу вам помочь советом. Сам потретил кучу времени на такие нецелесообразные задачи. )

Добавлено через 4 минуты
Wnmaster88, если цель- просто наследовать класс от загрузчика классов+чтобы можно было делать его действия, то просто наследуйтесь от URLClassLoader и оставьте пустой класс, загружать сможете из определенной папки также, как это делает класс, от которого наследовались. Делов-то на минуту, но зато какой лайфхак, экономящий кучу времени.

Добавлено через 6 минут
URLClassLoader лучше ClassLoader, сразу вам будет огромное наследство, примерно как в реальной жизни- вы не будете к бедной жене приставать, а сразу к богатой, у которой все есть и не надо уже ничего делать. Java имеет огромные возможности по эмуляции реального мира, пользуйтесь этим))

Добавлено через 1 минуту
Wnmaster88, могу показать решение вашей задачи, если не поняли.
1
0 / 0 / 0
Регистрация: 16.02.2016
Сообщений: 26
19.06.2019, 12:15  [ТС]
trgbvs,как я понимаю, цель просто наследовать класс от загрузчика классов, чтобы с его помощью можно было делать загрузку классов из определенной папки. Значит попробую сделать как Вы советуете и отправить на проверку, а там посмотрю уже по ответу.
Спасибо.
0
Заблокирован
19.06.2019, 12:39
Лучший ответ Сообщение было отмечено Wnmaster88 как решение

Решение

Wnmaster88, если это задачи учебного заведения, то я не удивляюсь, потому-что все они нецелесообразные и имейте ввиду, что суть программирования вы не поймете, я советую вникать самому во все, так как вам просто забивают мозг и заставляют городить много лишнего кода вместо того, чтобы банально подумать головой, что такой класс уже написан официальными разработчиками явы и можно просто наследоваться от него и выполнять все его методы, которые могут загружать класс из папки. Попробуйте так, как я сказал сделать, этот метод рабочий, а если не пройдет- это будет лишним доказательством несостоятельности и бездарности тех, кто проверял задачу. Я не сомневаюсь, что у них даже Нетбинса нет, хотя могу ошибаться, может и нормальные люди, которые проверят задачу в среде разработки.

Добавлено через 10 минут
Wnmaster88,
если что, вот так сделал-бы я:
Java
1
2
3
4
5
6
7
8
9
10
import java.net.URL;
import java.net.URLClassLoader;
 
public class SergeyClassLoader extends URLClassLoader{
    
    public SergeyClassLoader(URL[] urls) {
        super(urls);
    }
    
}
Добавлено через 36 секунд
Wnmaster88, и можем грузить классы по адресу с помощью уже класса с SergeyClassLoader. )

Добавлено через 4 минуты
Wnmaster88, если все-таки решитесь писать заново все это, наследовавшись от ClassLoader, то без меня, так как я против того, чтобы забивать новичку голову, мне гораздо приятнее смотреть на тех, кто думает своей головой и ищет легкие решения. )

Добавлено через 5 минут
Wnmaster88, потом отпишите обязательно, мне интересно, чем закончится. )
1
0 / 0 / 0
Регистрация: 16.02.2016
Сообщений: 26
19.06.2019, 12:47  [ТС]
trgbns, спасибо, да, как будет ответ, отпишусь, но не факт что это будет сегодня, там проверяют не сразу.
0
Заблокирован
19.06.2019, 12:51
Wnmaster88, хорошо, желаю вам успехов. Это конечно необычное решение, но главное, чтобы решало задачу и соответствовало условиям. У вас условие- наследоваться от класслоадера и сделать так,чтобы загружать классы из папки. Следовательно мое решение является верным, хоть и немного хитрым и наглым, а в нашем мире по-другому никак, сами-же знаете. ))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.06.2019, 12:51
Помогаю со студенческими работами здесь

Не могу понять что делаю не так
Хочу вывести ссылки постов определенного пользователя на страницу Wordpress... вот код if ( have_posts() ) : while ( have_posts()...

Что я делаю не так? не могу посчитать %
Здравствуйте, помогите, пожалуйста. Нужно посчитать 25% от цены. Пишу формулу в D2: =C2*D1, где С1 - число, а D1 - 25%. После ввода...

Не могу перемещать объекты, что делаю не так?
Не могу переместить объекты (их всего то 3 пока что), что я делаю не так? Пытался и картинку сделать отдельным блоком, но возникала другая...

Не могу понять, что не так делаю. Подскажите
Условие задания: Написать скрипт, производящий очистку указанной директории путем архивирования и сжатия (.tar.gz) всех файлов старше...

Задача на списки.Не могу понять,что делаю не так
Уважаемые форумчане,добрый вечер.Очень нужна ваша помощь. Значит у меня есть список пар городов,например: (a,b) (v,d) (a,b) (a,b) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru