aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gtPlusPlus/preloader/CustomClassLoader.java
blob: 56394c11f0aad84ce9cf3c07a470cb065b82228b (plain)
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
package gtPlusPlus.preloader;

import java.security.AllPermission;
import java.security.CodeSource;
import java.security.Permissions;
import java.security.ProtectionDomain;
import java.security.cert.Certificate;
import java.util.HashMap;

import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.tree.ClassNode;

public class CustomClassLoader extends ClassLoader {

	private HashMap<String, ClassNode> classes = new HashMap<String, ClassNode>();

	@Override

	public Class<?> loadClass(String name) throws ClassNotFoundException {
		return findClass(name);
	}

	@Override

	protected Class<?> findClass(String name) throws ClassNotFoundException {
		ClassNode node = classes.get(name.replace('.', '/'));
		if (node != null)
			return nodeToClass(node);
		else
			return super.findClass(name);
	}

	public final void addNode(ClassNode node) {
		classes.put(node.name, node);
	}

	private final Class<?> nodeToClass(ClassNode node) {
		if (super.findLoadedClass(node.name) != null)
			return findLoadedClass(node.name);
		ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
		node.accept(cw);
		byte[] b = cw.toByteArray();
		return defineClass(node.name.replace('/', '.'), b, 0, b.length,	getDomain());
	}

	private final ProtectionDomain getDomain() {
		CodeSource code = new CodeSource(null, (Certificate[]) null);
		return new ProtectionDomain(code, getPermissions());
	}

	private final Permissions getPermissions() {
		Permissions permissions = new Permissions();
		permissions.add(new AllPermission());
		return permissions;
	}

}