Fix issues related to InvUI#tryFindPlugin

- Fixed an issue where tryFindPlugin would throw an exception if the paper plugin class loader class wasn't found
- Surrounded most logic in tryFindPlugin with try-catch to ensure the more informative exception in getPlugin to be thrown in case of failure
This commit is contained in:
NichtStudioCode 2023-09-22 22:24:27 +02:00
parent 436f520a35
commit 39cc0534e7
3 changed files with 26 additions and 27 deletions

@ -13,10 +13,9 @@ public class ReflectionRegistry {
public static final int VERSION = getVersionNumber(); public static final int VERSION = getVersionNumber();
public static final String CRAFT_BUKKIT_PACKAGE_PATH = getCB(); public static final String CRAFT_BUKKIT_PACKAGE_PATH = getCB();
public static final String BUKKIT_PACKAGE_PATH = "org.bukkit.";
// Classes // Classes
public static final Class<?> PLUGIN_CLASS_LOADER_CLASS = getBukkitClass("plugin.java.PluginClassLoader"); public static final Class<?> PLUGIN_CLASS_LOADER_CLASS = ReflectionUtils.getClass("org.bukkit.plugin.java.PluginClassLoader");
public static final Class<?> PAPER_PLUGIN_CLASS_LOADER_CLASS = getClassOrNull("io.papermc.paper.plugin.entrypoint.classloader.PaperPluginClassLoader"); public static final Class<?> PAPER_PLUGIN_CLASS_LOADER_CLASS = getClassOrNull("io.papermc.paper.plugin.entrypoint.classloader.PaperPluginClassLoader");
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<?> CB_CRAFT_META_ITEM_CLASS = getCBClass("inventory.CraftMetaItem"); public static final Class<?> CB_CRAFT_META_ITEM_CLASS = getCBClass("inventory.CraftMetaItem");

@ -1,6 +1,8 @@
package xyz.xenondevs.inventoryaccess.util; package xyz.xenondevs.inventoryaccess.util;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import xyz.xenondevs.inventoryaccess.version.InventoryAccessRevision; import xyz.xenondevs.inventoryaccess.version.InventoryAccessRevision;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
@ -10,7 +12,7 @@ import java.lang.reflect.Method;
@SuppressWarnings({"unchecked", "unused"}) @SuppressWarnings({"unchecked", "unused"})
public class ReflectionUtils { public class ReflectionUtils {
protected static String getCB() { protected static @NotNull String getCB() {
String path = Bukkit.getServer().getClass().getPackage().getName(); String path = Bukkit.getServer().getClass().getPackage().getName();
String version = path.substring(path.lastIndexOf(".") + 1); String version = path.substring(path.lastIndexOf(".") + 1);
return "org.bukkit.craftbukkit." + version + "."; return "org.bukkit.craftbukkit." + version + ".";
@ -22,7 +24,7 @@ public class ReflectionUtils {
return Integer.parseInt(version.split("\\.")[1]); return Integer.parseInt(version.split("\\.")[1]);
} }
public static <T> Class<T> getImplClass(String path) { public static <T> @NotNull Class<T> getImplClass(@NotNull String path) {
try { try {
return (Class<T>) Class.forName("xyz.xenondevs.inventoryaccess." + InventoryAccessRevision.REQUIRED_REVISION.getPackageName() + "." + path); return (Class<T>) Class.forName("xyz.xenondevs.inventoryaccess." + InventoryAccessRevision.REQUIRED_REVISION.getPackageName() + "." + path);
} catch (Throwable t) { } catch (Throwable t) {
@ -30,15 +32,11 @@ public class ReflectionUtils {
} }
} }
public static <T> Class<T> getBukkitClass(String path) { public static <T> @NotNull Class<T> getCBClass(@NotNull String path) {
return getClass(ReflectionRegistry.BUKKIT_PACKAGE_PATH + path);
}
public static <T> Class<T> getCBClass(String path) {
return getClass(ReflectionRegistry.CRAFT_BUKKIT_PACKAGE_PATH + path); return getClass(ReflectionRegistry.CRAFT_BUKKIT_PACKAGE_PATH + path);
} }
public static <T> Class<T> getClass(String path) { public static <T> @NotNull Class<T> getClass(@NotNull String path) {
try { try {
return (Class<T>) Class.forName(path); return (Class<T>) Class.forName(path);
} catch (Throwable t) { } catch (Throwable t) {
@ -46,7 +44,7 @@ public class ReflectionUtils {
} }
} }
public static <T> Class<T> getClassOrNull(String path) { public static <T> @Nullable Class<T> getClassOrNull(@NotNull String path) {
try { try {
return (Class<T>) Class.forName(path); return (Class<T>) Class.forName(path);
} catch (Throwable t) { } catch (Throwable t) {
@ -54,7 +52,7 @@ public class ReflectionUtils {
} }
} }
public static Field getField(Class<?> clazz, boolean declared, String name) { public static @NotNull Field getField(@NotNull Class<?> clazz, boolean declared, @NotNull String name) {
try { try {
Field field = declared ? clazz.getDeclaredField(name) : clazz.getField(name); Field field = declared ? clazz.getDeclaredField(name) : clazz.getField(name);
if (declared) field.setAccessible(true); if (declared) field.setAccessible(true);
@ -64,7 +62,7 @@ public class ReflectionUtils {
} }
} }
public static <T> Constructor<T> getConstructor(Class<T> clazz, boolean declared, Class<?>... parameterTypes) { public static <T> @NotNull Constructor<T> getConstructor(@NotNull Class<T> clazz, boolean declared, @NotNull Class<?> @NotNull... parameterTypes) {
try { try {
Constructor<T> constructor = declared ? clazz.getDeclaredConstructor(parameterTypes) : clazz.getConstructor(parameterTypes); Constructor<T> constructor = declared ? clazz.getDeclaredConstructor(parameterTypes) : clazz.getConstructor(parameterTypes);
if (declared) constructor.setAccessible(true); if (declared) constructor.setAccessible(true);
@ -74,7 +72,7 @@ public class ReflectionUtils {
} }
} }
public static <T> T constructEmpty(Class<?> clazz) { public static <T> @NotNull T constructEmpty(@NotNull Class<?> clazz) {
try { try {
return (T) getConstructor(clazz, true).newInstance(); return (T) getConstructor(clazz, true).newInstance();
} catch (Throwable t) { } catch (Throwable t) {
@ -82,7 +80,7 @@ public class ReflectionUtils {
} }
} }
public static <T> T construct(Constructor<T> constructor, Object... args) { public static <T> @NotNull T construct(@NotNull Constructor<T> constructor, @Nullable Object @Nullable... args) {
try { try {
return constructor.newInstance(args); return constructor.newInstance(args);
} catch (Throwable t) { } catch (Throwable t) {
@ -90,7 +88,7 @@ public class ReflectionUtils {
} }
} }
public static Method getMethod(Class<?> clazz, boolean declared, String name, Class<?>... parameterTypes) { public static @NotNull Method getMethod(@NotNull Class<?> clazz, boolean declared, @NotNull String name, @NotNull Class<?>@NotNull ... parameterTypes) {
try { try {
Method method = declared ? clazz.getDeclaredMethod(name, parameterTypes) : clazz.getMethod(name, parameterTypes); Method method = declared ? clazz.getDeclaredMethod(name, parameterTypes) : clazz.getMethod(name, parameterTypes);
if (declared) method.setAccessible(true); if (declared) method.setAccessible(true);
@ -100,7 +98,7 @@ public class ReflectionUtils {
} }
} }
public static Method getMethodOrNull(Class<?> clazz, boolean declared, String name, Class<?>... parameterTypes) { public static @Nullable Method getMethodOrNull(@NotNull Class<?> clazz, boolean declared, @NotNull String name, @NotNull Class<?> @NotNull... parameterTypes) {
try { try {
Method method = declared ? clazz.getDeclaredMethod(name, parameterTypes) : clazz.getMethod(name, parameterTypes); Method method = declared ? clazz.getDeclaredMethod(name, parameterTypes) : clazz.getMethod(name, parameterTypes);
if (declared) method.setAccessible(true); if (declared) method.setAccessible(true);
@ -110,7 +108,7 @@ public class ReflectionUtils {
} }
} }
public static <T> T invokeMethod(Method method, Object obj, Object... args) { public static <T> T invokeMethod(@NotNull Method method, @Nullable Object obj, @Nullable Object @Nullable... args) {
try { try {
return (T) method.invoke(obj, args); return (T) method.invoke(obj, args);
} catch (Throwable t) { } catch (Throwable t) {
@ -118,7 +116,7 @@ public class ReflectionUtils {
} }
} }
public static void setFieldValue(Field field, Object obj, Object value) { public static void setFieldValue(@NotNull Field field, @Nullable Object obj, @Nullable Object value) {
try { try {
field.set(obj, value); field.set(obj, value);
} catch (Throwable t) { } catch (Throwable t) {
@ -127,7 +125,7 @@ public class ReflectionUtils {
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T> T getFieldValue(Field field, Object obj) { public static <T> @Nullable T getFieldValue(@NotNull Field field, @Nullable Object obj) {
try { try {
return (T) field.get(obj); return (T) field.get(obj);
} catch (Throwable t) { } catch (Throwable t) {

@ -7,15 +7,13 @@ import org.bukkit.event.server.PluginDisableEvent;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.logging.Logger; import java.util.logging.Logger;
import static xyz.xenondevs.inventoryaccess.util.ReflectionRegistry.PAPER_PLUGIN_CLASS_LOADER_GET_LOADED_JAVA_PLUGIN_METHOD; import static xyz.xenondevs.inventoryaccess.util.ReflectionRegistry.*;
import static xyz.xenondevs.inventoryaccess.util.ReflectionRegistry.PLUGIN_CLASS_LOADER_PLUGIN_FIELD;
public class InvUI implements Listener { public class InvUI implements Listener {
@ -45,10 +43,14 @@ public class InvUI implements Listener {
private @Nullable Plugin tryFindPlugin() { private @Nullable Plugin tryFindPlugin() {
ClassLoader loader = getClass().getClassLoader(); ClassLoader loader = getClass().getClassLoader();
if (ReflectionRegistry.PLUGIN_CLASS_LOADER_CLASS.isInstance(loader)) { try {
return ReflectionUtils.getFieldValue(PLUGIN_CLASS_LOADER_PLUGIN_FIELD, loader); if (PLUGIN_CLASS_LOADER_CLASS.isInstance(loader)) {
} else if (ReflectionRegistry.PAPER_PLUGIN_CLASS_LOADER_CLASS.isInstance(loader)) { return ReflectionUtils.getFieldValue(PLUGIN_CLASS_LOADER_PLUGIN_FIELD, loader);
return ReflectionUtils.invokeMethod(PAPER_PLUGIN_CLASS_LOADER_GET_LOADED_JAVA_PLUGIN_METHOD, loader); } else if (PAPER_PLUGIN_CLASS_LOADER_CLASS != null && PAPER_PLUGIN_CLASS_LOADER_CLASS.isInstance(loader)) {
return ReflectionUtils.invokeMethod(PAPER_PLUGIN_CLASS_LOADER_GET_LOADED_JAVA_PLUGIN_METHOD, loader);
}
} catch (Throwable t) {
t.printStackTrace();
} }
return null; return null;