From 3c79bb028d6900ef18c9d6fc008d856f59f6e1f7 Mon Sep 17 00:00:00 2001 From: SeanOMik Date: Mon, 14 Jun 2021 12:33:45 -0400 Subject: [PATCH] Fix plugin for Java 1.16 --- pom.xml | 2 +- .../tamablefoxes/versions/FieldHelper.java | 49 ++++++++++++++----- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index a6c3dc9..2fd0769 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ net.seanomik tamablefoxes - 1.9.2-SNAPSHOT + 1.9.2.1-SNAPSHOT jar Tamablefoxes diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/FieldHelper.java b/src/main/java/net/seanomik/tamablefoxes/versions/FieldHelper.java index 52a28b1..2529016 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/FieldHelper.java +++ b/src/main/java/net/seanomik/tamablefoxes/versions/FieldHelper.java @@ -6,22 +6,49 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import java.lang.invoke.MethodHandles; -//import java.lang.invoke.VarHandle; +import java.lang.invoke.MethodType; +import java.lang.invoke.VarHandle; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public final class FieldHelper { - public static void makeNonFinal(Field field) { - try { - if ((field.getModifiers() & Modifier.FINAL) == Modifier.FINAL) { - Field fieldMutable = field.getClass().getDeclaredField("modifiers"); - fieldMutable.setAccessible(true); - fieldMutable.set(field, fieldMutable.getInt(field) & ~Modifier.FINAL); - fieldMutable.setAccessible(false); + + private static final VarHandle MODIFIERS; + + static { + String version = System.getProperty("java.version"); + if (!version.startsWith("1.8")) { + try { + MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(Field.class, MethodHandles.lookup()); + MODIFIERS = lookup.findVarHandle(Field.class, "modifiers", int.class); + } catch (IllegalAccessException | NoSuchFieldException ex) { + throw new RuntimeException(ex); + } + } else { + MODIFIERS = null; + } + } + + + public static void makeNonFinal(Field field) { + // Check if we're running a supported java version for this new method. + if (MODIFIERS == null) { + try { + if ((field.getModifiers() & Modifier.FINAL) == Modifier.FINAL) { + Field fieldMutable = field.getClass().getDeclaredField("modifiers"); + fieldMutable.setAccessible(true); + fieldMutable.set(field, fieldMutable.getInt(field) & ~Modifier.FINAL); + fieldMutable.setAccessible(false); + } + } catch (NoSuchFieldException | IllegalAccessException e) { + Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); + e.printStackTrace(); + } + } else { + int mods = field.getModifiers(); + if (Modifier.isFinal(mods)) { + MODIFIERS.set(field, mods & ~Modifier.FINAL); } - } catch (NoSuchFieldException | IllegalAccessException e) { - Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); - e.printStackTrace(); } }