diff --git a/BukkitUtils/src/main/java/eu/mikroskeem/utils/bukkit/ServerUtils.java b/BukkitUtils/src/main/java/eu/mikroskeem/utils/bukkit/ServerUtils.java index 9e1a59b..c10ceee 100644 --- a/BukkitUtils/src/main/java/eu/mikroskeem/utils/bukkit/ServerUtils.java +++ b/BukkitUtils/src/main/java/eu/mikroskeem/utils/bukkit/ServerUtils.java @@ -4,6 +4,7 @@ import eu.mikroskeem.utils.reflect.Reflect; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPluginLoader; +import org.jetbrains.annotations.Nullable; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -43,6 +44,7 @@ public class ServerUtils { * @return Plugin ClassLoader */ @SuppressWarnings("unchecked") + @Nullable public static ClassLoader getPluginClassLoader(JavaPlugin plugin){ /* * Note: CB/Spigot has PluginClassLoader package-private, PaperSpigot has public @@ -83,6 +85,34 @@ public class ServerUtils { return null; } + /** + * Get PluginClassLoader classes map + * @param classLoader PluginClassLoader instance + * @return Classes map + * @throws RuntimeException if ClassLoader doesn't extend PluginClassLoader + */ + @SuppressWarnings("unchecked") + @Nullable + public static Map> getClassesMap(ClassLoader classLoader){ + Class clClass = classLoader.getClass(); + try { + Class pluginClassLoader = checkNotNull(Reflect.getClass( + "org.bukkit.plugin.java.PluginClassLoader")); + if(pluginClassLoader.isAssignableFrom(clClass)){ + Field classesField = checkNotNull(Reflect.getField(clClass, "classes")); + return (Map>) checkNotNull(Reflect.readField(classesField, classLoader)); + } else { + throw new RuntimeException( + clClass.getName() + + " does not extend " + + pluginClassLoader.getName()); + } + } catch(NullPointerException e){ + e.printStackTrace(); + } + return null; + } + /** * Get NMS version of current running server * @return NMS version or 0 length string