TransformingClassLoader class
Пакет: com.hypixel.hytale.plugin.early
Файл: com/hypixel/hytale/plugin/early/TransformingClassLoader.java
extends: URLClassLoader
Поля (14)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
Set<String> |
SECURE_PACKAGE_PREFIXES |
|
CodeSource |
var10 |
|
ProtectionDomain |
var11 |
|
Class |
var15 |
|
String |
var2 |
|
|
var3 |
|
String |
var3 |
|
Class |
var4 |
|
int |
var4 |
|
String |
var5 |
|
URL |
var6 |
|
byte[] |
var7 |
|
Class |
var8 |
|
URL |
var9 |
Методы (13)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
|
for for(ClassTransformer var6 : this.transformers) |
|
|
for for(String var2 : SECURE_PACKAGE_PREFIXES) |
static |
URL |
getCodeSourceUrlURL getCodeSourceUrl(URL var0, String var1) |
|
|
if if(var4 != null) |
|
|
if if(var2) |
|
|
if if(var2) |
|
|
if if(var6 != null) |
|
|
if if(var2) |
|
|
if if(var7 != null) |
|
|
if if(var4 > 0) |
static |
boolean |
isPreloadedClassboolean isPreloadedClass(@Nonnull String var0) |
static |
boolean |
isSecureClassboolean isSecureClass(@Nonnull String var0) |
abstract |
|
super super(var1, var3) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.plugin.early;
class="kw">import java.io.IOException;
class="kw">import java.io.InputStream;
class="kw">import java.net.URL;
class="kw">import java.net.URLClassLoader;
class="kw">import java.security.CodeSource;
class="kw">import java.security.ProtectionDomain;
class="kw">import java.security.cert.Certificate;
class="kw">import java.util.List;
class="kw">import java.util.Set;
class="kw">import javax.annotation.Nonnull;
class="kw">public class="kw">final class TransformingClassLoader class="kw">extends URLClassLoader {
class="kw">private class="kw">static class="kw">final Set<String> SECURE_PACKAGE_PREFIXES = Set.of(
"java.",
"javax.",
"jdk.",
"sun.",
"com.sun.",
"org.bouncycastle.",
"server.io.netty.",
"org.objectweb.asm.",
"com.google.gson.",
"org.slf4j.",
"org.apache.logging.",
"ch.qos.logback.",
"com.google.flogger.",
"server.io.sentry.",
"com.hypixel.fastutil.",
"com.hypixel.hytale.plugin.early."
);
class="kw">private class="kw">final List<ClassTransformer> transformers;
class="kw">private class="kw">final ClassLoader appClassLoader;
class="kw">public TransformingClassLoader(@Nonnull URL[] var1, @Nonnull List<ClassTransformer> var2, ClassLoader var3, ClassLoader var4) {
super(var1, var3);
this.transformers = var2;
this.appClassLoader = var4;
}
@Override
class="kw">protected Class<?> loadClass(String var1, boolean var2) class="kw">throws ClassNotFoundException {
class="kw">synchronized (this.getClassLoadingLock(var1)) {
Class var4 = this.findLoadedClass(var1);
if (var4 != null) {
if (var2) {
this.resolveClass(var4);
}
class="kw">return var4;
} else if (isPreloadedClass(var1)) {
Class var15 = this.appClassLoader.loadClass(var1);
if (var2) {
this.resolveClass(var15);
}
class="kw">return var15;
} else {
String var5 = var1.replace('.', '/');
URL var6 = this.findResource(var5 + ".class");
if (var6 != null) {
try (InputStream var7 = var6.openStream()) {
Class var8 = this.transformAndDefine(var1, var5, var7.readAllBytes(), var6);
if (var2) {
this.resolveClass(var8);
}
class="kw">return var8;
} catch (IOException var13) {
}
}
class="kw">return super.loadClass(var1, var2);
}
}
}
class="kw">private Class<?> transformAndDefine(String var1, String var2, byte[] var3, URL var4) {
if (!isSecureClass(var1)) {
for (ClassTransformer var6 : this.transformers) {
try {
byte[] var7 = var6.transform(var1, var2, var3);
if (var7 != null) {
var3 = var7;
}
} catch (Exception var8) {
System.err.println("[EarlyPlugin] Transformer " + var6.getClass().getName() + " failed on " + var1 + ": " + var8.getMessage());
var8.printStackTrace();
}
}
}
URL var9 = getCodeSourceUrl(var4, var2);
CodeSource var10 = new CodeSource(var9, (Certificate[])null);
ProtectionDomain var11 = new ProtectionDomain(var10, null, this, null);
class="kw">return this.defineClass(var1, var3, 0, var3.length, var11);
}
class="kw">private class="kw">static URL getCodeSourceUrl(URL var0, String var1) {
String var2 = var0.toString();
String var3 = var1 + ".class";
if (var2.startsWith("jar:")) {
int var4 = var2.indexOf("!/");
if (var4 > 0) {
try {
class="kw">return new URL(var2.substring(4, var4));
} catch (Exception var6) {
class="kw">return var0;
}
}
} else if (var2.endsWith(var3)) {
try {
class="kw">return new URL(var2.substring(0, var2.length() - var3.length()));
} catch (Exception var7) {
class="kw">return var0;
}
}
class="kw">return var0;
}
class="kw">private class="kw">static boolean isPreloadedClass(@Nonnull String var0) {
class="kw">return var0.equals("com.hypixel.hytale.Main") || var0.startsWith("com.hypixel.hytale.plugin.early.");
}
class="kw">private class="kw">static boolean isSecureClass(@Nonnull String var0) {
for (String var2 : SECURE_PACKAGE_PREFIXES) {
if (var0.startsWith(var2)) {
class="kw">return true;
}
}
class="kw">return false;
}
}