???
package com.javarush.task.task36.task3606;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
/*
Осваиваем 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 {
File dir = new File(packageName);
ClassLoader classLoader = Solution.class.getClassLoader();
String[] pathes = dir.list(new FilenameFilter() {
@Override
public boolean accept(File dir1, String name) {
return name.toLowerCase(Locale.ROOT).endsWith(".class");
}
});
for (String p : pathes) {
try {
String className = packageName.substring(packageName.lastIndexOf("com/")).replaceAll("[/\\\\]", ".") + "." + p.substring(0, p.length() - 6);
hiddenClasses.add(classLoader.loadClass(className));
} catch (Exception e) {
}
}
}
public HiddenClass getHiddenClassObjectByKey(String key) {
for (Class<?> clazz : hiddenClasses) {
if (clazz.getSimpleName().toLowerCase().startsWith(key.toLowerCase())) {
try {
Constructor<?> constructor = clazz.getDeclaredConstructor();
constructor.setAccessible(true);
return (HiddenClass) constructor.newInstance();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return null;
}
}