Осваиваем ClassLoader и Reflection

  • 16
  • Недоступна
Аргументом для класса Solution является абсолютный путь к пакету. Имя пакета может содержать File.separator. В этом пакете кроме скомпилированных классов (.class) могут находиться и другие файлы (например: .java). Известно, что каждый класс имеет конструктор без параметров и реализует интерфейс Hidd
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (81)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
2 июля, 11:11
Задача очень похожа на предыдущую задачу c ClassLoader'ом (я сделал copy/paste из неё) и ту, где надо создать объект класса, у которого есть только private-конструктор без параметров. Каждый вызов метода getHiddenClassObjectByKey() должен создавать свой объект класса, иначе валидатор не примет. Фабрика в данном случае - это просто метод, который создаёт объект класса, а не тот шедевр архитектуры ПО, который мы создавали в предыдущей большой задаче "Фабрики" 🙂
LuneFox инженер по сопровождению в BIFIT Expert
17 февраля, 16:49
Ну да, ну да, пошёл я нафиг... Тем временем, готовое решение от валидатора делает это:
Максим Дудин
Уровень 39, Калининград
31 мая, 12:44
Если поменять ru/ на com/, то работает, но при валидации выдаёт а если не менять, то проходит валидацию, но не работает..
Nik Grape
Уровень 48, Berkeley, United States
17 ноября 2021, 21:22
похоже проходит только через
public static class MyClassLoader extends ClassLoader {
        public Class<? extends HiddenClass> load(Path path) {
             ...
             ... defineClass(String name, byte[] buf, int start, int len);
tremb
Уровень 41, Москва, Россия
10 ноября 2021, 21:00
2919 Оказывается можно не указывать binary name
Иван
Уровень 41, Рязань, Россия
1 ноября 2021, 10:57
Какой то бред Exception in thread "main" java.lang.ClassNotFoundException: FirstHiddenClassImpl.class, не понимаю как его может не быть если он есть изначально в пакете
Ars
Уровень 41
25 ноября 2021, 08:32
Он не в пакете. В main указан путь к пакету который в папке out.
RFedorenkov
Уровень 47, Москва, Россия
17 октября 2021, 19:34
в пакете 'com/' не ищется, пока не надо в 'ru/ 14 попыток, едем дальше
Тимур
Уровень 38, Москва, Россия
17 октября 2021, 22:12
Может исправили уже, у меня все норм нашло...
Artamon Khakimov
Уровень 35, Казань, Россия
8 октября 2021, 07:00
Всем привет. Вот сижу и ничего не понимаю. Вроде бы делал всё постепенно, но задачу не пойму. Ребята, кто-нибудь подскажите статьи или ссылки на видео с данной темой задачи.
Aleksandr Alekseenko Network engineer
12 августа 2021, 04:16
В этот раз было действительно смешно. При формировании бинарного имени класса необходимо было заменить com/ на ru/ В методе main указан com/. Явная ошибка валидатора. Делал через ClassLoader classLoader = Solution.class.getClassLoader(), без создания анонимных классов. Постараюсь собрать все замечения, что были отмечены ниже. 1. Доступ к файлам через files.listFiles(). SonarLint подсказал вот такое интересное усовершенствование. Objects.requireNonNull(files.listFiles()) 2. Формировать бинарное имя класса можно, как угодно. Только перед проверкой у вали не забыть заменить com на ru. 3. В методе getHiddenClassObjectByKey ключ (key) и clazz.getSimpleName(), перед использованием метода contains(), привести к toLowerCase() 4. Получение конструктора через getDeclaredConstructor().
Maks Panteleev Java Developer в Bell Integrator
23 июля 2021, 09:02
задача 1 в 1 как предыдущая такая, я почти весь код скопировал оттуда, пару нюансов только поменял - доступ к конструктору) потратил кучу попыток на валидацию - оказалось что все дело в ключе getHiddenClassObjectByKey(String key) - его так же надо привести к нижнему регистру, иначе не проходит валидация)
Ars
Уровень 41
25 ноября 2021, 08:34
Спасибо. Этот момент был крайне неожиданным. Вот прям от слова совсем.
Alex Prosmickii
Уровень 27, Минск, Беларусь
21 июля 2021, 14:39
мда, вымучил задачу, все работало, компилятор не принимал. Забил, скопировал полностью решение - не работает, зато компилятор принял.
Алексей
Уровень 37, Москва, Россия
6 августа 2021, 13:56
чтобы программа заработала - нужно в строке ниже поменять lastIndexOf("ru/") на lastIndexOf("com/"): String className = packageName.replaceAll("[/\\\\]", ".").substring(packageName.lastIndexOf("ru/")) + "." + fileName.substring(0, fileName.length() - 6); Все дело в том, что в packageName такой подстроки "ru/" нет, поэтому lastIndexOf возвращает -1, и прога выкидывает исключение неправильный индекс массива в substring(-1)!!!