diff options
Diffstat (limited to 'src/main/java/net/openhft/chronicle/core')
3 files changed, 19 insertions, 4 deletions
diff --git a/src/main/java/net/openhft/chronicle/core/ClassLoading.java b/src/main/java/net/openhft/chronicle/core/ClassLoading.java index 5465e63..d6744d2 100644 --- a/src/main/java/net/openhft/chronicle/core/ClassLoading.java +++ b/src/main/java/net/openhft/chronicle/core/ClassLoading.java @@ -41,6 +41,10 @@ public enum ClassLoading { * @return the class loaded. */ private static Class defineClass(ClassLoader classLoader, String className, byte[] bytes) { - return UnsafeMemory.UNSAFE.defineClass(className, bytes, 0, bytes.length, classLoader, null); + try { + return (Class) UnsafeMemory.defineClassMethodHandle.bindTo(classLoader).invokeWithArguments(className, bytes, 0, bytes.length); + } catch (Throwable e) { + throw new RuntimeException(e); + } } } diff --git a/src/main/java/net/openhft/chronicle/core/UnsafeMemory.java b/src/main/java/net/openhft/chronicle/core/UnsafeMemory.java index d7192d9..a6030e2 100644 --- a/src/main/java/net/openhft/chronicle/core/UnsafeMemory.java +++ b/src/main/java/net/openhft/chronicle/core/UnsafeMemory.java @@ -18,12 +18,16 @@ package net.openhft.chronicle.core; import net.openhft.chronicle.core.annotation.ForceInline; import sun.misc.Unsafe; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.lang.reflect.Field; import java.util.concurrent.atomic.AtomicLong; public class UnsafeMemory implements Memory { static Unsafe UNSAFE; + static MethodHandle defineClassMethodHandle; private final AtomicLong nativeMemoryUsed = new AtomicLong(); public static Memory create() { @@ -34,6 +38,14 @@ public class UnsafeMemory implements Memory { } catch (IllegalAccessException | IllegalArgumentException e) { throw new AssertionError(e); } + try { + MethodHandles.Lookup baseLookup = MethodHandles.lookup(); + MethodType defineClassMethodType = MethodType.methodType(Class.class, new Class[]{String.class, byte[].class, int.class, int.class}); + MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(ClassLoader.class, baseLookup); + defineClassMethodHandle = lookup.findVirtual(ClassLoader.class, "defineClass", defineClassMethodType); + } catch (Throwable e) { + throw new RuntimeException(e); + } } return new UnsafeMemory(); } diff --git a/src/main/java/net/openhft/chronicle/core/io/IOTools.java b/src/main/java/net/openhft/chronicle/core/io/IOTools.java index 2b8fc78..30aec3a 100644 --- a/src/main/java/net/openhft/chronicle/core/io/IOTools.java +++ b/src/main/java/net/openhft/chronicle/core/io/IOTools.java @@ -16,8 +16,6 @@ package net.openhft.chronicle.core.io; -import sun.reflect.Reflection; - import java.io.*; /** @@ -29,7 +27,8 @@ public enum IOTools { public static byte[] readFile(String name) throws IOException { ClassLoader classLoader; try { - classLoader = Reflection.getCallerClass().getClassLoader(); + StackWalker instance = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); + classLoader = instance.getCallerClass().getClassLoader(); } catch (Throwable e) { classLoader = Thread.currentThread().getContextClassLoader(); } |