From 11fd673a6e6f512f31e8cf9f38738aeb517c1e53 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Wed, 26 Mar 2025 15:11:53 +0100 Subject: [PATCH 1/2] Use MethodHandle API --- .../commands/ACFBukkitLocalesListener.java | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/bukkit/src/main/java/co/aikar/commands/ACFBukkitLocalesListener.java b/bukkit/src/main/java/co/aikar/commands/ACFBukkitLocalesListener.java index 68e9d2fb..405a7d5f 100644 --- a/bukkit/src/main/java/co/aikar/commands/ACFBukkitLocalesListener.java +++ b/bukkit/src/main/java/co/aikar/commands/ACFBukkitLocalesListener.java @@ -28,6 +28,9 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerLocaleChangeEvent; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Locale; @@ -35,6 +38,7 @@ import java.util.Locale; class ACFBukkitLocalesListener implements Listener { private final BukkitCommandManager manager; + private MethodHandle localeMethod1_8 = null; ACFBukkitLocalesListener(BukkitCommandManager manager) { this.manager = manager; @@ -56,13 +60,24 @@ class ACFBukkitLocalesListener implements Listener { } } catch (NoSuchMethodError ignored2) { try { - Method getNewLocale = event.getClass().getMethod("getNewLocale"); - getNewLocale.setAccessible(true); - String value = (String) getNewLocale.invoke(event); + if (localeMethod1_8 != null) { + String value = (String) localeMethod1_8.invoke(event); + if (!value.equals(manager.issuersLocaleString.get(player.getUniqueId()))) { + locale = ACFBukkitUtil.stringToLocale(value); + } + + return; + } + + MethodHandles.Lookup lookup = MethodHandles.lookup(); + MethodType type = MethodType.methodType(String.class); + + localeMethod1_8 = lookup.findVirtual(PlayerLocaleChangeEvent.class, "getNewLocale", type); + String value = (String) localeMethod1_8.invoke(event); if (!value.equals(manager.issuersLocaleString.get(player.getUniqueId()))) { locale = ACFBukkitUtil.stringToLocale(value); } - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored3) { + } catch (Throwable ignored3) { } } } From a2cf22892c06b84e935e423f9ffab12c88674d6c Mon Sep 17 00:00:00 2001 From: chickeneer Date: Sat, 12 Apr 2025 09:25:20 -0500 Subject: [PATCH 2/2] Improve MethodHandle API PR for ACFBukkitLocalesListener --- .../commands/ACFBukkitLocalesListener.java | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/bukkit/src/main/java/co/aikar/commands/ACFBukkitLocalesListener.java b/bukkit/src/main/java/co/aikar/commands/ACFBukkitLocalesListener.java index 405a7d5f..9dd3bc7d 100644 --- a/bukkit/src/main/java/co/aikar/commands/ACFBukkitLocalesListener.java +++ b/bukkit/src/main/java/co/aikar/commands/ACFBukkitLocalesListener.java @@ -31,14 +31,13 @@ import org.bukkit.event.player.PlayerLocaleChangeEvent; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.Locale; class ACFBukkitLocalesListener implements Listener { private final BukkitCommandManager manager; private MethodHandle localeMethod1_8 = null; + private boolean checkedLocaleMethod1_8 = false; ACFBukkitLocalesListener(BukkitCommandManager manager) { this.manager = manager; @@ -60,24 +59,20 @@ class ACFBukkitLocalesListener implements Listener { } } catch (NoSuchMethodError ignored2) { try { + if (!checkedLocaleMethod1_8) { + checkedLocaleMethod1_8 = true; + MethodHandles.Lookup lookup = MethodHandles.lookup(); + MethodType type = MethodType.methodType(String.class); + localeMethod1_8 = lookup.findVirtual(PlayerLocaleChangeEvent.class, "getNewLocale", type); + } if (localeMethod1_8 != null) { String value = (String) localeMethod1_8.invoke(event); if (!value.equals(manager.issuersLocaleString.get(player.getUniqueId()))) { locale = ACFBukkitUtil.stringToLocale(value); } - - return; } - - MethodHandles.Lookup lookup = MethodHandles.lookup(); - MethodType type = MethodType.methodType(String.class); - - localeMethod1_8 = lookup.findVirtual(PlayerLocaleChangeEvent.class, "getNewLocale", type); - String value = (String) localeMethod1_8.invoke(event); - if (!value.equals(manager.issuersLocaleString.get(player.getUniqueId()))) { - locale = ACFBukkitUtil.stringToLocale(value); - } - } catch (Throwable ignored3) { + } catch (Throwable t) { + manager.log(LogLevel.ERROR, "Error registering MethodHandle for LocaleChangeEvent", t); } } }