This commit is contained in:
redkale
2024-10-06 22:36:29 +08:00
parent acdd626d4f
commit d20d20f46a

View File

@@ -70,17 +70,26 @@ public final class Utility {
static { static {
MethodHandles.Lookup defaultLookup0 = null; MethodHandles.Lookup defaultLookup0 = null;
try { try {
Field implLookup = MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP"); final Class lookupClass = MethodHandles.Lookup.class;
implLookup.setAccessible(true); final ClassLoader loader = Thread.currentThread().getContextClassLoader();
defaultLookup0 = (MethodHandles.Lookup) implLookup.get(null); Class unsafeClass = loader.loadClass("sun.misc.Unsafe");
RedkaleClassLoader.putReflectionField(MethodHandles.Lookup.class.getName(), implLookup); Field safeField = unsafeClass.getDeclaredField("theUnsafe");
RedkaleClassLoader.putReflectionField("sun.misc.Unsafe", safeField);
safeField.setAccessible(true);
final Object usafe = safeField.get(null);
Method staticFieldOffsetMethod = usafe.getClass().getMethod("staticFieldOffset", Field.class);
Method getObjectMethod = usafe.getClass().getMethod("getObject", Object.class, long.class);
Field implLookup = lookupClass.getDeclaredField("IMPL_LOOKUP");
long fieldOffset = (Long) staticFieldOffsetMethod.invoke(usafe, implLookup);
defaultLookup0 = (MethodHandles.Lookup) getObjectMethod.invoke(usafe, lookupClass, fieldOffset);
RedkaleClassLoader.putReflectionField(lookupClass.getName(), implLookup);
} catch (Throwable e) { } catch (Throwable e) {
defaultLookup0 = MethodHandles.lookup(); defaultLookup0 = MethodHandles.lookup();
} }
defaultLookup = defaultLookup0; defaultLookup = defaultLookup0;
} }
private static final Executor defaultExecutorConsumer = command -> command.run(); private static final Executor defaultExecutorConsumer = Runnable::run;
// org.redkale.util.JDK21VirtualThreadLocal // org.redkale.util.JDK21VirtualThreadLocal
private static final Function<Supplier, ThreadLocal> virtualThreadLocalFunction; private static final Function<Supplier, ThreadLocal> virtualThreadLocalFunction;