I get
java.lang.NoClassDefFoundError: com/codegym/task/task35/task3507/data/Cat (wrong name: Cat)
expection when I try to run it, no idea what's wrong. I looked at directory, everything seems fine.package com.codegym.task.task35.task3507;
import java.io.File;
import java.io.FilenameFilter;
import java.net.*;
import java.util.HashSet;
import java.util.Set;
/*
What is ClassLoader?
*/
public class Solution {
public static void main(String[] args) throws ClassNotFoundException, MalformedURLException, InstantiationException, IllegalAccessException, URISyntaxException {
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 URISyntaxException, MalformedURLException, ClassNotFoundException, IllegalAccessException, InstantiationException {
Set<Animal> classes = new HashSet<>();
URLClassLoader classLoader = new URLClassLoader(new URL[]{new URI(pathToAnimals).toURL()});
File directory = new File(pathToAnimals);
File[] files = directory.listFiles((file, s) -> s.endsWith(".class"));
for(File a : files) {
String className = a.getName().substring(0, a.getName().length() - 6);
Class<?> clazz = classLoader.loadClass(className);
if(Animal.class.isAssignableFrom(clazz)) {
try{
Object animal = clazz.newInstance();
classes.add((Animal) animal);
} catch (Exception e) {
continue;
}
}
}
return classes;
}
}