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();
}
}