diff options
| author | Martin Robertz <dream-master@gmx.net> | 2021-12-15 16:11:54 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-15 16:11:54 +0100 |
| commit | 128c74faa99dfef8d056c1d82c6e4388b9d470e8 (patch) | |
| tree | 2c84162154ba681232f86dffd4106db530236814 /src/main/java/gtPlusPlus/preloader/CustomClassLoader.java | |
| parent | 47ce336f288a45aa3244c8ae1177499fa5080942 (diff) | |
| parent | ff4b8c7068c2ea7d654e9beda00646d23e62b314 (diff) | |
| download | GT5-Unofficial-128c74faa99dfef8d056c1d82c6e4388b9d470e8.tar.gz GT5-Unofficial-128c74faa99dfef8d056c1d82c6e4388b9d470e8.tar.bz2 GT5-Unofficial-128c74faa99dfef8d056c1d82c6e4388b9d470e8.zip | |
Merge pull request #65 from GTNewHorizons/unified-build-script2
Move sources and resources
Diffstat (limited to 'src/main/java/gtPlusPlus/preloader/CustomClassLoader.java')
| -rw-r--r-- | src/main/java/gtPlusPlus/preloader/CustomClassLoader.java | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/main/java/gtPlusPlus/preloader/CustomClassLoader.java b/src/main/java/gtPlusPlus/preloader/CustomClassLoader.java new file mode 100644 index 0000000000..56394c11f0 --- /dev/null +++ b/src/main/java/gtPlusPlus/preloader/CustomClassLoader.java @@ -0,0 +1,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; + } + +}
\ No newline at end of file |
