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;
   }
}