вывод
[com.javarush.task.task35.task3507.data.Cat@61a485d2]
package com.javarush.task.task35.task3507;
import javax.print.attribute.standard.Fidelity;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashSet;
import java.util.Set;
/*
ClassLoader - что это такое?
*/
public class Solution extends ClassLoader {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
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, IllegalAccessException, InvocationTargetException, InstantiationException {
pathToAnimals = pathToAnimals.replace("%20", " ");
if (pathToAnimals.charAt(pathToAnimals.length() - 1) != '/')
pathToAnimals = pathToAnimals + "/";
if (pathToAnimals.charAt(0) == '/')
pathToAnimals = pathToAnimals.replaceFirst("/", "");
File[] files = new File(pathToAnimals).listFiles();
Set<Animal> animals = new HashSet<>();
for (File file: files) {
Solution solution = new Solution();
Class clazz = solution.findClass(file.getAbsolutePath());
Constructor [] constructors = clazz.getConstructors();
for (Constructor c : constructors) {
if (c.getModifiers() == Modifier.PUBLIC) {
if (c.getParameterTypes().length == 0) {
if (Animal.class.isAssignableFrom(clazz)) {
c.setAccessible(true);
animals.add((Animal) c.newInstance());
}
}
}
}
}
return animals;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
Path file = Paths.get(name);
byte[] bytes = Files.readAllBytes(file);
return defineClass(null, bytes, 0, bytes.length);
} catch (IOException e) {
e.printStackTrace();
}
return super.findClass(name);
}
}