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> allAnimals = new HashSet<>();
MyClassLoader classLoader = new MyClassLoader();
try {
for (File file : Objects.requireNonNull(new File(pathToAnimals).listFiles())) {
Class clazz = classLoader.loadClass(file.getAbsolutePath());
if (Animal.class.isAssignableFrom(clazz) && clazz.getConstructors().length != 0)
allAnimals.add((Animal) clazz.newInstance());
}
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
e.printStackTrace();
}
return allAnimals;
}
public static class MyClassLoader extends ClassLoader {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
Class clazz = null;
try {
byte[] bytes = Files.readAllBytes(Paths.get(name));
clazz = defineClass(null, bytes, 0, bytes.length);
} catch (IOException e) {
e.printStackTrace();
}
return clazz;
}
}
}
Вот весь код. При выполнении возникает ошибка NoSuchFileException на строке clazz = defineClass(null, bytes, 0, bytes.length); (почти в самом низу). Не понимаю, что не так. Проверял, с путями к скомпилированным классам всё корректно. Конкретно, вот такие пути у меня находит:
C:\Java_My_Projects\JavaRushTasks\out\production\4.JavaCollections\com\javarush\task\task35\task3507\data\Cat.class
C:\Java_My_Projects\JavaRushTasks\out\production\4.JavaCollections\com\javarush\task\task35\task3507\data\Elephant.class
C:\Java_My_Projects\JavaRushTasks\out\production\4.JavaCollections\com\javarush\task\task35\task3507\data\Sheep.class
Считываю с файла все байты, передаю их в defineClass и такая вот лажа возникает.Евгений
41 уровень
Ошибка NoSuchFileException. Почему возникает?
Решен
Комментарии (3)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Artamon Khakimov
12 сентября 2021, 13:54
clazz.getConstructors().length != 0 - не подскажешь ,что делает эта строка?
0
Евгений Backend Developer в KHAN Group Expert
12 сентября 2021, 15:01
ну получается проверяет, что количество конструкторов в классе не равно нулю. Наверное так
+1
Евгений Backend Developer в KHAN Group Expert
4 июля 2020, 17:52
Ошибка ушла после того, как я вместо переопределения loadClass создал свой метод и перенёс логику в него.
+1