Напрвьте, пожалуйста((
Еще и ругань на 32 строку почему-то..
package com.javarush.task.task36.task3606;
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/*
Осваиваем 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 sep = System.getProperty(File.separator);
if(!packageName.endsWith(sep))
packageName = packageName.concat(sep);
File[] files = new File(packageName).listFiles((folder, name) -> name.endsWith(".class"));
MyLoader loader;
for (File f :
files) {
loader = new MyLoader(ClassLoader.getSystemClassLoader(), packageName);
hiddenClasses.add(loader.findClass(packageName+f.getName()));
}
}
public class MyLoader extends ClassLoader{
String packageName;
public MyLoader(ClassLoader classLoader, String packageName){
super(classLoader); this.packageName = packageName;}
public Class<?> findClass(String path) throws ClassNotFoundException {
Class<?> c = null;
try(FileInputStream fis = new FileInputStream(path)) {
byte[] b = new byte[(int) new File(path).length()];
fis.read(b, 0, b.length);
fis.close();
c = defineClass(null, b, 0, b.length);
} catch (ClassFormatError | IOException classFormatError) { super.findClass(path);}
return c;
}
}
public HiddenClass getHiddenClassObjectByKey(String key) {
HiddenClass hc = null;
try {
for (Class<?> cl : hiddenClasses) {
if (cl.getSimpleName().toLowerCase().startsWith(key))
hc = (HiddenClass) cl.newInstance();
}
Constructor[] constructors;
if(hc != null) {
constructors = hc.getClass().getDeclaredConstructors();
for (Constructor c : constructors) {
if (c.getParameterCount() == 0) {
c.setAccessible(true);
return (HiddenClass) c.newInstance();
}
}
}
}catch (IllegalAccessException | InstantiationException | InvocationTargetException e) {}
return null;
}
}