Skip to content
This repository was archived by the owner on Feb 16, 2022. It is now read-only.

Commit bf87bba

Browse files
Fixed class loader arch.
1 parent 5175b67 commit bf87bba

2 files changed

Lines changed: 38 additions & 16 deletions

File tree

src/main/java/com/realtimetech/reflection/classfile/DependencyFinder.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -185,19 +185,10 @@ public static Class<?>[] getAllDependenciesClass(Class<?> clazz) throws IOExcept
185185

186186
recursiveSearch(clazz, classDynamicLoader, resultClasses);
187187

188-
Class<?>[] resultClassArray = resultClasses.toArray(new Class[resultClasses.size()]);
189-
190-
for (Class<?> resultClass : resultClassArray) {
191-
recursiveSort(resultClass, resultClass, resultClasses);
192-
}
193-
194188
for (Class<?> dependencyClass : resultClasses) {
195189
ClassFile[] classFiles = ClassFileReader.getClassBytes(dependencyClass);
196190
for (ClassFile classFile : classFiles) {
197-
try {
198-
classDynamicLoader.loadClassByBytes(classFile.getBytes(), classFile.getName());
199-
} catch (Exception e) {
200-
}
191+
classDynamicLoader.addClassFile(classFile);
201192
}
202193
}
203194

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,50 @@
11
package com.realtimetech.reflection.classloader;
22

3+
import java.util.HashMap;
4+
5+
import com.realtimetech.reflection.classfile.classfile.ClassFile;
6+
37
public class ClassDynamicLoader extends ClassLoader {
4-
public ClassDynamicLoader() {
5-
super(null);
6-
}
8+
private HashMap<String, byte[]> classMap;
79

8-
public ClassDynamicLoader(Class<?> baseClass) {
9-
super(baseClass.getClassLoader());
10+
public ClassDynamicLoader() {
11+
this(null);
1012
}
1113

1214
public ClassDynamicLoader(ClassLoader classLoader) {
1315
super(classLoader);
16+
this.classMap = new HashMap<String, byte[]>();
17+
}
18+
19+
public void addClass(String className, byte[] bytes) {
20+
this.classMap.put(className, bytes);
21+
}
22+
23+
public void addClassFile(ClassFile className) {
24+
this.classMap.put(className.getName(), className.getBytes());
25+
}
26+
27+
@Override
28+
protected Class<?> findClass(String name) throws ClassNotFoundException {
29+
Class<?> result = null;
30+
try {
31+
result = super.findClass(name);
32+
} catch (ClassNotFoundException e) {
33+
if (this.classMap.containsKey(name)) {
34+
byte[] bytes = this.classMap.get(name);
35+
this.classMap.remove(name);
36+
result = defineClass(name, bytes, 0, bytes.length);
37+
}
38+
}
39+
40+
if (result == null) {
41+
throw new ClassNotFoundException();
42+
}
43+
44+
return result;
1445
}
1546

16-
public Class<?> loadClassByBytes(byte[] bytes, String className) {
47+
public Class<?> loadClassByBytes(String className, byte[] bytes) {
1748
return defineClass(className, bytes, 0, bytes.length);
1849
}
1950
}

0 commit comments

Comments
 (0)