вывод в консоль верный
[com.javarush.task.task35.task3507.data.Cat@65b3120a]
только класс Cat наследуется от Animal и имеет публичный конструктор без параметров
для проверки делаю пабликом конструктор в классе Sheep
[com.javarush.task.task35.task3507.data.Cat@65b3120a, com.javarush.task.task35.task3507.data.Sheep@5e9f23b4]
Пробовал делать через getDeclaredConstructors() - начинаем добавлять объекты и с приватным конструктором, все равно не принимает.
Что хочет валидатор?
package com.javarush.task.task35.task3507;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.net.URLDecoder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/*
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) {
Set<Animal> animals = new HashSet<>();
try {
while (pathToAnimals.length() > 1 && pathToAnimals.startsWith("/"))
pathToAnimals = pathToAnimals.substring(1, pathToAnimals.length());
List<Path> files = Files.walk(Paths.get(URLDecoder.decode(pathToAnimals, "UTF-8")))
.filter(Files::isRegularFile)
.filter(path -> path.toString().toLowerCase().endsWith(".class"))
.collect(Collectors.toList());
for (Path file : files) {
try {
MyLoader myLoader = new MyLoader();
Class clazz = myLoader.findClass(file.toString());
Constructor[] constructors = clazz.getDeclaredConstructors();
boolean hasDefaultConstructor = false;
for (Constructor c : constructors) {
hasDefaultConstructor = (c.getParameterTypes().length == 0);
c.setAccessible(true);
if (Animal.class.isAssignableFrom(clazz) && hasDefaultConstructor)
animals.add((Animal) c.newInstance());
}
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
return animals;
}
public static class MyLoader extends ClassLoader {
@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);
}
}
}