Skip to content

Commit b1b050b

Browse files
authored
Merge pull request #426 from Intybyte/fix/method-handle
Use MethodHandle API
2 parents 5efec64 + a2cf228 commit b1b050b

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

bukkit/src/main/java/co/aikar/commands/ACFBukkitLocalesListener.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,16 @@
2828
import org.bukkit.event.Listener;
2929
import org.bukkit.event.player.PlayerLocaleChangeEvent;
3030

31-
import java.lang.reflect.InvocationTargetException;
32-
import java.lang.reflect.Method;
31+
import java.lang.invoke.MethodHandle;
32+
import java.lang.invoke.MethodHandles;
33+
import java.lang.invoke.MethodType;
3334
import java.util.Locale;
3435

3536
class ACFBukkitLocalesListener implements Listener {
3637

3738
private final BukkitCommandManager manager;
39+
private MethodHandle localeMethod1_8 = null;
40+
private boolean checkedLocaleMethod1_8 = false;
3841

3942
ACFBukkitLocalesListener(BukkitCommandManager manager) {
4043
this.manager = manager;
@@ -56,13 +59,20 @@ void onLocaleChange(PlayerLocaleChangeEvent event) {
5659
}
5760
} catch (NoSuchMethodError ignored2) {
5861
try {
59-
Method getNewLocale = event.getClass().getMethod("getNewLocale");
60-
getNewLocale.setAccessible(true);
61-
String value = (String) getNewLocale.invoke(event);
62-
if (!value.equals(manager.issuersLocaleString.get(player.getUniqueId()))) {
63-
locale = ACFBukkitUtil.stringToLocale(value);
62+
if (!checkedLocaleMethod1_8) {
63+
checkedLocaleMethod1_8 = true;
64+
MethodHandles.Lookup lookup = MethodHandles.lookup();
65+
MethodType type = MethodType.methodType(String.class);
66+
localeMethod1_8 = lookup.findVirtual(PlayerLocaleChangeEvent.class, "getNewLocale", type);
6467
}
65-
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored3) {
68+
if (localeMethod1_8 != null) {
69+
String value = (String) localeMethod1_8.invoke(event);
70+
if (!value.equals(manager.issuersLocaleString.get(player.getUniqueId()))) {
71+
locale = ACFBukkitUtil.stringToLocale(value);
72+
}
73+
}
74+
} catch (Throwable t) {
75+
manager.log(LogLevel.ERROR, "Error registering MethodHandle for LocaleChangeEvent", t);
6676
}
6777
}
6878
}

0 commit comments

Comments
 (0)