Вроде учёл ошибки всех предшественников, но похоже наделал своих. Может кто-то подсказать, что не так?
package com.javarush.task.task36.task3606;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
/*
Осваиваем ClassLoader и Reflection
*/
public class Solution {
private List<Class> hiddenClasses = new ArrayList<>();
private String packageName;
public Solution(String packageName) {
this.packageName = packageName;
}
public static void main(String[] args) throws ClassNotFoundException {
Solution solution = new Solution(Solution.class.getProtectionDomain().getCodeSource().getLocation().getPath() + "com/javarush/task/task36/task3606/data/second");
solution.scanFileSystem();
System.out.println(solution.getHiddenClassObjectByKey("secondhiddenclassimpl"));
System.out.println(solution.getHiddenClassObjectByKey("firsthiddenclassimpl"));
System.out.println(solution.getHiddenClassObjectByKey("packa"));
}
public void scanFileSystem() throws ClassNotFoundException {
String pathName = packageName;
String sep = System.getProperty("file.separator");
if(!packageName.endsWith(sep))
packageName = packageName.concat(sep);
File dir = new File(packageName);
String forName = pathName.replace(this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath(), "").replace('/', '.') + ".";
File[] files = dir.listFiles();
for (File file:
files) {
String name = file.getName();
if(name.endsWith(".class")) {
name = name.substring(0, name.lastIndexOf('.'));
hiddenClasses.add(Class.forName(forName + name));
}
}
}
public HiddenClass getHiddenClassObjectByKey(String key) {
HiddenClass result = null;
for (Class clazz:
hiddenClasses) {
String className = clazz.getSimpleName().toLowerCase();
if(className.startsWith(key.toLowerCase()) && HiddenClass.class.isAssignableFrom(clazz)) {
try {
Constructor<HiddenClass>[] constructors = clazz.getDeclaredConstructors();
Constructor<HiddenClass> constructor = null;
for (Constructor<HiddenClass> constr:
constructors) {
if(constr.getGenericParameterTypes().length == 0 && constr.getParameterTypes().length == 0)
constructor = constr;
}
assert constructor != null;
constructor.setAccessible(true);
result = constructor.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
break;
}
}
return result;
}
}