Get Plugin from PluginClassLoader

This commit is contained in:
NichtStudioCode 2021-02-02 20:50:04 +01:00
parent a5262128c9
commit 8512a749bf
3 changed files with 35 additions and 12 deletions

@ -1,31 +1,32 @@
package de.studiocode.invgui; package de.studiocode.invgui;
import de.studiocode.invgui.util.reflection.ReflectionUtils;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static de.studiocode.invgui.util.reflection.ReflectionRegistry.PLUGIN_CLASS_LOADER_PLUGIN_FIELD;
public class InvGui { public class InvGui {
private static InvGui instance; private static InvGui instance;
private final List<Runnable> disableHandlers = new ArrayList<>(); private final List<Runnable> disableHandlers = new ArrayList<>();
private Plugin plugin; private final Plugin plugin;
public InvGui() {
this.plugin = ReflectionUtils.getFieldValue(PLUGIN_CLASS_LOADER_PLUGIN_FIELD, getClass().getClassLoader());
}
public static InvGui getInstance() { public static InvGui getInstance() {
return instance == null ? instance = new InvGui() : instance; return instance == null ? instance = new InvGui() : instance;
} }
public Plugin getPlugin() { public Plugin getPlugin() {
if (plugin == null)
throw new IllegalStateException("Please set your plugin using InvGui.getInstance().setPlugin");
return plugin; return plugin;
} }
public void setPlugin(Plugin plugin) {
this.plugin = plugin;
}
public void addDisableHandler(Runnable runnable) { public void addDisableHandler(Runnable runnable) {
disableHandlers.add(runnable); disableHandlers.add(runnable);
} }

@ -2,18 +2,20 @@ package de.studiocode.invgui.util.reflection;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import static de.studiocode.invgui.util.reflection.ReflectionUtils.getCBClass; import static de.studiocode.invgui.util.reflection.ReflectionUtils.*;
import static de.studiocode.invgui.util.reflection.ReflectionUtils.getField;
public class ReflectionRegistry { public class ReflectionRegistry {
public static final String NET_MINECRAFT_SERVER_PACKAGE_PATH = ReflectionUtils.getNMS(); public static final String NET_MINECRAFT_SERVER_PACKAGE_PATH = ReflectionUtils.getNMS();
public static final String CRAFT_BUKKIT_PACKAGE_PATH = ReflectionUtils.getCB(); public static final String CRAFT_BUKKIT_PACKAGE_PATH = ReflectionUtils.getCB();
public static final String BUKKIT_PACKAGE_PATH = "org.bukkit.";
// Classes // Classes
public static final Class<?> CB_CRAFT_META_SKULL_CLASS = getCBClass("inventory.CraftMetaSkull"); public static final Class<?> CB_CRAFT_META_SKULL_CLASS = getCBClass("inventory.CraftMetaSkull");
public static final Class<?> PLUGIN_CLASS_LOADER_CLASS = getBukkitClass("plugin.java.PluginClassLoader");
// Fields // Fields
public static final Field CB_CRAFT_META_SKULL_PROFILE_FIELD = getField(CB_CRAFT_META_SKULL_CLASS, true, "profile"); public static final Field CB_CRAFT_META_SKULL_PROFILE_FIELD = getField(CB_CRAFT_META_SKULL_CLASS, true, "profile");
public static final Field PLUGIN_CLASS_LOADER_PLUGIN_FIELD = getField(PLUGIN_CLASS_LOADER_CLASS, true, "plugin");
} }

@ -6,8 +6,7 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import static de.studiocode.invgui.util.reflection.ReflectionRegistry.CRAFT_BUKKIT_PACKAGE_PATH; import static de.studiocode.invgui.util.reflection.ReflectionRegistry.*;
import static de.studiocode.invgui.util.reflection.ReflectionRegistry.NET_MINECRAFT_SERVER_PACKAGE_PATH;
public class ReflectionUtils { public class ReflectionUtils {
@ -23,6 +22,16 @@ public class ReflectionUtils {
return "net.minecraft.server." + version + "."; return "net.minecraft.server." + version + ".";
} }
public static Class<?> getBukkitClass(String path) {
try {
return Class.forName(BUKKIT_PACKAGE_PATH + path);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
public static Class<?> getNMSClass(String path) { public static Class<?> getNMSClass(String path) {
try { try {
return Class.forName(NET_MINECRAFT_SERVER_PACKAGE_PATH + path); return Class.forName(NET_MINECRAFT_SERVER_PACKAGE_PATH + path);
@ -83,4 +92,15 @@ public class ReflectionUtils {
} }
} }
@SuppressWarnings("unchecked")
public static <T> T getFieldValue(Field field, Object obj) {
try {
return (T) field.get(obj);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
} }