Не могу понять. почему не проходит по второму пункту. Вроде уже воткнул проверку на количство параметров в конструкторе (хотя, она уже была селана на предыдущем этапе). Вроде вывод тот что надо:
com.javarush.task.task36.task3606.data.second.SecondHiddenClassImpl@6108b2d7
com.javarush.task.task36.task3606.data.second.FirstHiddenClassImpl@1554909b
com.javarush.task.task36.task3606.data.second.PackageAccessClass@6bf256fa
А все равно не пускает.
package com.javarush.task.task36.task3606;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
/*
Осваиваем ClassLoader и Reflection
*/
public class Solution extends ClassLoader{
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");
String pathName = packageName;
if(!(packageName.endsWith(sep))){
pathName = pathName.concat(sep);
}
File[] files = new File(pathName).listFiles();
for (File f : files) {
Class clazz = findClass(f.getAbsolutePath());
Constructor[] constructors = clazz.getDeclaredConstructors();
for (Constructor c : constructors)
if (c.getParameters().length == 0)
if (HiddenClass.class.isAssignableFrom(clazz))
hiddenClasses.add(clazz);
}
}
public HiddenClass getHiddenClassObjectByKey(String key){
Class clazz = null;
for (Class c : hiddenClasses) {
if (c.getSimpleName().toLowerCase().startsWith(key)) {
clazz = c;
break;
}
}
try {
Constructor[] constructors = clazz.getDeclaredConstructors();
for (Constructor con : constructors)
if (con.getParameterTypes().length == 0) {
con.setAccessible(true);
return (HiddenClass) con.newInstance();
}
}
catch (Exception e){}
return null;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
Path file = Paths.get(name);
byte[] bytes = Files.readAllBytes(file);
return defineClass(null, bytes, 0, bytes.length);
} catch (IOException e) {
e.printStackTrace();
}
return super.findClass(name);
}
}