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;
import de.studiocode.invgui.util.reflection.ReflectionUtils;
import org.bukkit.plugin.Plugin;
import java.util.ArrayList;
import java.util.List;
import static de.studiocode.invgui.util.reflection.ReflectionRegistry.PLUGIN_CLASS_LOADER_PLUGIN_FIELD;
public class InvGui {
private static InvGui instance;
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() {
return instance == null ? instance = new InvGui() : instance;
}
public Plugin getPlugin() {
if (plugin == null)
throw new IllegalStateException("Please set your plugin using InvGui.getInstance().setPlugin");
return plugin;
}
public void setPlugin(Plugin plugin) {
this.plugin = plugin;
}
public void addDisableHandler(Runnable runnable) {
disableHandlers.add(runnable);
}

@ -2,18 +2,20 @@ package de.studiocode.invgui.util.reflection;
import java.lang.reflect.Field;
import static de.studiocode.invgui.util.reflection.ReflectionUtils.getCBClass;
import static de.studiocode.invgui.util.reflection.ReflectionUtils.getField;
import static de.studiocode.invgui.util.reflection.ReflectionUtils.*;
public class ReflectionRegistry {
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 BUKKIT_PACKAGE_PATH = "org.bukkit.";
// Classes
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
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.Method;
import static de.studiocode.invgui.util.reflection.ReflectionRegistry.CRAFT_BUKKIT_PACKAGE_PATH;
import static de.studiocode.invgui.util.reflection.ReflectionRegistry.NET_MINECRAFT_SERVER_PACKAGE_PATH;
import static de.studiocode.invgui.util.reflection.ReflectionRegistry.*;
public class ReflectionUtils {
@ -23,6 +22,16 @@ public class ReflectionUtils {
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) {
try {
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;
}
}