Не проходят 1 и 2 пункты. Смотрю, все делают через переопределение класса ClassLoader, но не понимаю - зачем? Ведь всё работает и через ClassLoader.getSystemClassLoader(), вывод соответствует условию. Что не так?
package com.javarush.task.task35.task3507;
import java.io.*;
import java.lang.reflect.*;
import java.util.HashSet;
import java.util.Set;
/* ClassLoader - что это такое?*/
public class Solution {
public static void main(String[] args) {
Set<? extends Animal> allAnimals = getAllAnimals(Solution.class.getProtectionDomain().
getCodeSource().getLocation().getPath() + Solution.class.getPackage().getName().replaceAll("[.]", "/") + "/data");
System.out.println(allAnimals);
}
public static Set<? extends Animal> getAllAnimals(String pathToAnimals) {
HashSet<Animal> set = new HashSet<>();
File directory = new File(pathToAnimals);//создаём объект-директорию
File[] files = directory.listFiles();//получаем массив файлов из директории
for (File f : files) {
if (f.getName().endsWith(".class")) {//проверка расширения файла
String className = f.getName().split("\\.")[0];//получаем имя файла
String binaryFileName = Solution.class.getPackage().getName() + ".data." + className;//генерируем binary name
try {
Class clazz = ClassLoader.getSystemClassLoader().loadClass(binaryFileName);//получаем объект Class по бинарному имени
Constructor constructor = clazz.getConstructor();//получаем конструктор по умолчанию или ошибку, если его нет
if (constructor != null && Animal.class.isAssignableFrom(clazz)) {
Animal animal = (Animal) clazz.newInstance();//приводим созданный объект к интерфейсу Animal
set.add(animal);
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
} catch (NoSuchMethodException e) {
//System.out.println("Нет такого конструктора");
}
}
}
return set;
}
}