I can't figure out how to approach this correctly. Can someone give a hint or two?
package com.codegym.task.task36.task3606;
import java.io.*;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
/*
Mastering ClassLoader and 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/codegym/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 {
ClassLoader loader = Solution.class.getClassLoader();
String pack = packageName.replace(".", "/");
String dottedPackage = pack.replaceAll("[/]", ".");
URL uPackage = loader.getResource(pack);
try {
DataInputStream dis = new DataInputStream((InputStream) uPackage.getContent());
String line = null;
while ((line = dis.readLine()) != null) {
if (line.endsWith(".class")) {
hiddenClasses.add(Class.forName(dottedPackage + "." + line.substring(0, line.lastIndexOf('.'))));
}
}
}
catch (IOException ignored){}
/*URL root = Thread.currentThread().getContextClassLoader().getResource(packageName.replace(".", "/"));
File[] files = new File(root.getFile()).listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".class");
}
});
for (File file : files) {
String className = file.getName().replaceAll(".class$", "");
Class<?> cls = Class.forName(className);
hiddenClasses.add(cls);
}
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URL packageURL = classLoader.getResource(packageName.replaceAll("[.]", "/"));
try {
URI uri = new URI(packageURL.toString());
File folder = new File(uri.getPath());
File[] files = folder.listFiles();
for (File f : files) {
hiddenClasses.add(f.getClass());
}
}
catch (URISyntaxException ignored){}*/
}
public HiddenClass getHiddenClassObjectByKey(String key) {
HiddenClass hiddenClass = null;
for (Class C : hiddenClasses){
if (C.getSimpleName().startsWith(key.toLowerCase())){
try {
hiddenClass = (HiddenClass) C.newInstance();
}
catch (InstantiationException | IllegalAccessException ignored){}
}
}
return hiddenClass;
}
}