-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSolution.java
More file actions
107 lines (81 loc) · 4.16 KB
/
Solution.java
File metadata and controls
107 lines (81 loc) · 4.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
//Nathanael answered and saith unto him, Rabbi, thou art the Son of God; thou art the King of Israel. (John 1:49)
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.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("hiddenclassimplse"));
System.out.println(solution.getHiddenClassObjectByKey("hiddenclassimplf"));
System.out.println(solution.getHiddenClassObjectByKey("packa"));
}
public void scanFileSystem() throws ClassNotFoundException {
File[] files = new File(packageName).listFiles();
ClassLoaderFromPath classLoader = new ClassLoaderFromPath();
for (File file : files) {
Class<?> clazz = classLoader.load(file.toPath());
if (clazz != null)
hiddenClasses.add(clazz);
}
}
public HiddenClass getHiddenClassObjectByKey(String key) {
for (Class<?> clazz : hiddenClasses) {
if (clazz.getSimpleName().toLowerCase().startsWith(key.toLowerCase())) {
try {
Constructor[] constructors = clazz.getDeclaredConstructors();
for (Constructor constructor : constructors) {
if (constructor.getParameterTypes().length == 0) {
constructor.setAccessible(true);
return (HiddenClass) constructor.newInstance(null);
}
}
} catch (Exception e) {
return null;
}
}
}
return null;
}
public static class ClassLoaderFromPath extends ClassLoader {
public Class<?> load(Path path) {
try {
if (path.getFileName().toString().lastIndexOf(".class") == -1)
return null;
byte[] b = Files.readAllBytes(path);
return defineClass(null, b, 0, b.length); //here main magic
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
}
/*
Осваиваем ClassLoader и Reflection
Аргументом для класса Solution является абсолютный путь к пакету.
Имя пакета может содержать File.separator.
В этом пакете кроме скомпилированных классов (.class) могут находиться и другие файлы (например: .java).
Известно, что каждый класс имеет конструктор без параметров и реализует интерфейс HiddenClass.
Считай все классы с файловой системы, создай фабрику - реализуй метод getHiddenClassObjectByKey.
Примечание: в пакете может быть только один класс, простое имя которого начинается с String key без учета регистра.
Требования:
1. Реализуй метод scanFileSystem, он должен добавлять в поле hiddenClasses найденные классы.
2. Реализуй метод getHiddenClassObjectByKey, он должен создавать объект класса согласно условию задачи.
3. Метод main не изменяй.
4. Метод getHiddenClassObjectByKey не должен кидать исключений.
*/