From 09f69bb380d8129038b2ba791b367e33421bf582 Mon Sep 17 00:00:00 2001 From: Frank van der Heijden Date: Wed, 19 May 2021 23:45:23 +0200 Subject: [PATCH] Fix NoSuchFieldException on JavaPluginLoader#classes --- .../bukkit/reflection/RJavaPluginLoader.java | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RJavaPluginLoader.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RJavaPluginLoader.java index 30c209b..e3555ef 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RJavaPluginLoader.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RJavaPluginLoader.java @@ -3,10 +3,14 @@ package net.frankheijden.serverutils.bukkit.reflection; import dev.frankheijden.minecraftreflection.MinecraftReflection; import java.util.Collection; import java.util.Map; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import dev.frankheijden.minecraftreflection.exceptions.MinecraftReflectionException; import org.bukkit.plugin.java.JavaPluginLoader; public class RJavaPluginLoader { + private RJavaPluginLoader() {} + private static final MinecraftReflection reflection = MinecraftReflection.of(JavaPluginLoader.class); public static MinecraftReflection getReflection() { @@ -19,11 +23,37 @@ public class RJavaPluginLoader { * @param list The list of classpaths. */ public static void removeClasses(Object instance, Collection list) { - Map> classes = reflection.get(instance, "classes"); - if (classes == null) return; + Map> classes = getFieldIfExists(instance, "classes"); + if (classes != null) { + for (String key : list) { + classes.remove(key); + } + } - for (String key : list) { - classes.remove(key); + Map classLoadLockCount = getFieldIfExists(instance, "classLoadLockCount"); + if (classLoadLockCount != null) { + for (String key : list) { + classLoadLockCount.remove(key); + } + } + + Map classLoadLock = getFieldIfExists(instance, "classLoadLock"); + if (classLoadLock != null) { + for (String key : list) { + classLoadLock.remove(key); + } + } + } + + private static T getFieldIfExists(Object instance, String field) { + try { + return reflection.get(instance, field); + } catch (MinecraftReflectionException ex) { + if (ex.getCause() instanceof NoSuchFieldException) { + return null; + } else { + throw ex; + } } } }