Add dependency jdk 11 compat
This commit is contained in:
parent
69b98c180f
commit
e50bede493
@ -6,6 +6,8 @@ import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.invoke.MethodHandle;
|
||||
import java.lang.invoke.MethodType;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
@ -19,11 +21,11 @@ public class TDependencyLoader {
|
||||
try {
|
||||
ClassLoader loader = plugin instanceof InternalPlugin ? Bukkit.class.getClassLoader() : plugin.getClass().getClassLoader();
|
||||
Field ucpField = loader.getClass().getDeclaredField("ucp");
|
||||
long ucpOffset = Ref.UNSAFE.objectFieldOffset(ucpField);
|
||||
Object ucp = Ref.UNSAFE.getObject(loader, ucpOffset);
|
||||
Method addURL = ucp.getClass().getMethod("addURL", URL.class);
|
||||
addURL.invoke(ucp, url);
|
||||
} catch (Exception e) {
|
||||
long ucpOffset = Ref.getUnsafe().objectFieldOffset(ucpField);
|
||||
Object ucp = Ref.getUnsafe().getObject(loader, ucpOffset);
|
||||
MethodHandle methodHandle = Ref.lookup().findVirtual(ucp.getClass(), "addURL", MethodType.methodType(void.class, java.net.URL.class));
|
||||
methodHandle.invoke(ucp, url);
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
@ -65,7 +65,7 @@ public class TScheduleLoader implements TabooLibLoader.Loader {
|
||||
method.invoke(instance);
|
||||
} catch (Throwable t) {
|
||||
try {
|
||||
method.invoke(Ref.UNSAFE.allocateInstance(pluginClass));
|
||||
method.invoke(Ref.getUnsafe().allocateInstance(pluginClass));
|
||||
} catch (Throwable t2) {
|
||||
t.printStackTrace();
|
||||
t2.printStackTrace();
|
||||
|
@ -12,6 +12,7 @@ import sun.misc.Unsafe;
|
||||
import sun.reflect.Reflection;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
@ -19,6 +20,7 @@ import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@SuppressWarnings("restriction")
|
||||
@ThreadSafe
|
||||
public class Ref {
|
||||
|
||||
@ -28,16 +30,29 @@ public class Ref {
|
||||
|
||||
public static final int ACC_BRIDGE = 0x0040;
|
||||
public static final int ACC_SYNTHETIC = 0x1000;
|
||||
public static final Unsafe UNSAFE = getUnsafe();
|
||||
private static final Unsafe UNSAFE;
|
||||
private static final MethodHandles.Lookup LOOKUP;
|
||||
|
||||
static Unsafe getUnsafe() {
|
||||
static {
|
||||
try {
|
||||
return (Unsafe) io.izzel.taboolib.util.Reflection.getValue(null, Unsafe.class, true, "theUnsafe");
|
||||
UNSAFE = (Unsafe) io.izzel.taboolib.util.Reflection.getValue(null, Unsafe.class, true, "theUnsafe");
|
||||
Field lookupField = MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP");
|
||||
Object lookupBase = UNSAFE.staticFieldBase(lookupField);
|
||||
long lookupOffset = UNSAFE.staticFieldOffset(lookupField);
|
||||
LOOKUP = (MethodHandles.Lookup) UNSAFE.getObject(lookupBase, lookupOffset);
|
||||
} catch (Throwable t) {
|
||||
throw new IllegalStateException("Unsafe not found");
|
||||
}
|
||||
}
|
||||
|
||||
public static Unsafe getUnsafe() {
|
||||
return UNSAFE;
|
||||
}
|
||||
|
||||
public static MethodHandles.Lookup lookup() {
|
||||
return LOOKUP;
|
||||
}
|
||||
|
||||
public static List<Field> getDeclaredFields(Class<?> clazz) {
|
||||
return getDeclaredFields(clazz, 0, true);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user