Очень интересно что в этот раз не понравилось валидатору? Моему старому другу)
package com.javarush.task.task35.task3507;
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.*;
/*
ClassLoader - что это такое?
*/
public class Solution {
public static void main(String[] args) throws ClassNotFoundException, IOException, InstantiationException, IllegalAccessException {
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) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {
Set<Animal> set = new HashSet<>();
File classPackage = new File(pathToAnimals);
File[] classFiles = classPackage.listFiles();
URLClassLoader urlClassLoader;
String classPath;
String className;
Class clazz;
Class[] interfaces;
Constructor[] constructors;
for (int i = 0; i < classFiles.length; i++) {
classPath = classFiles[i].getCanonicalPath().replaceAll("\\\\", "/");
urlClassLoader = new URLClassLoader(new URL[]{new URL("file:///" + classPath)});
className = classPath.split("4.JavaCollections/")[1].replace("/", ".").replace(".class", "");
clazz = urlClassLoader.loadClass(className);
interfaces = clazz.getInterfaces();
if (interfaces.length > 0) {
for (int j = 0; j < interfaces.length; j++) {
if (interfaces[j].equals(Animal.class)) {
try {
Animal animal = (Animal) clazz.getConstructor().newInstance();
set.add(animal);
} catch (InvocationTargetException | NoSuchMethodException e) {
}
}
}
}
}
return set;
}
}