From 8b4a334873d71c6a2c0c316f4e820ad699b8b833 Mon Sep 17 00:00:00 2001 From: Mark Vainomaa Date: Wed, 18 Jan 2017 03:46:07 +0200 Subject: [PATCH] Add method to get PluginClassLoader's classes map --- .../mikroskeem/utils/bukkit/ServerUtils.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) 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