From 637f2b53a9b870dada64c47a8c9b9971b065a79d Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Mon, 20 Apr 2020 22:07:50 +0800 Subject: [PATCH] support jdk 11 --- .../bytekit/utils/ClassLoaderUtils.java | 48 +++++++++++++++++++ .../arthas/bytekit/utils/VerifyUtils.java | 4 +- 2 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 bytekit/src/main/java/com/taobao/arthas/bytekit/utils/ClassLoaderUtils.java diff --git a/bytekit/src/main/java/com/taobao/arthas/bytekit/utils/ClassLoaderUtils.java b/bytekit/src/main/java/com/taobao/arthas/bytekit/utils/ClassLoaderUtils.java new file mode 100644 index 000000000..8f5a78a9a --- /dev/null +++ b/bytekit/src/main/java/com/taobao/arthas/bytekit/utils/ClassLoaderUtils.java @@ -0,0 +1,48 @@ +package com.taobao.arthas.bytekit.utils; + +import java.lang.reflect.Field; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; + +import sun.misc.Unsafe; + + +/** + * + * @author hengyunabc 2017-10-12 + * + */ +public class ClassLoaderUtils { + @SuppressWarnings({ "restriction", "unchecked" }) + public static URL[] getUrls(ClassLoader classLoader) { + if (classLoader instanceof URLClassLoader) { + return ((URLClassLoader) classLoader).getURLs(); + } + + // jdk9 + if (classLoader.getClass().getName().startsWith("jdk.internal.loader.ClassLoaders$")) { + try { + Field field = Unsafe.class.getDeclaredField("theUnsafe"); + field.setAccessible(true); + Unsafe unsafe = (Unsafe) field.get(null); + + // jdk.internal.loader.ClassLoaders.AppClassLoader.ucp + Field ucpField = classLoader.getClass().getDeclaredField("ucp"); + long ucpFieldOffset = unsafe.objectFieldOffset(ucpField); + Object ucpObject = unsafe.getObject(classLoader, ucpFieldOffset); + + // jdk.internal.loader.URLClassPath.path + Field pathField = ucpField.getType().getDeclaredField("path"); + long pathFieldOffset = unsafe.objectFieldOffset(pathField); + ArrayList path = (ArrayList) unsafe.getObject(ucpObject, pathFieldOffset); + + return path.toArray(new URL[path.size()]); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + return null; + } +} \ No newline at end of file diff --git a/bytekit/src/main/java/com/taobao/arthas/bytekit/utils/VerifyUtils.java b/bytekit/src/main/java/com/taobao/arthas/bytekit/utils/VerifyUtils.java index f60bac4b1..9a69cfe4d 100644 --- a/bytekit/src/main/java/com/taobao/arthas/bytekit/utils/VerifyUtils.java +++ b/bytekit/src/main/java/com/taobao/arthas/bytekit/utils/VerifyUtils.java @@ -31,10 +31,8 @@ public class VerifyUtils { public static Object instanceVerity(byte[] bytes) throws Exception { String name = Type.getObjectType(AsmUtils.toClassNode(bytes).name).getClassName(); - URLClassLoader systemClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); - @SuppressWarnings("resource") - ClassbyteClassLoader cl = new ClassbyteClassLoader(systemClassLoader.getURLs(), + ClassbyteClassLoader cl = new ClassbyteClassLoader(ClassLoaderUtils.getUrls(ClassLoader.getSystemClassLoader()), ClassLoader.getSystemClassLoader().getParent()); cl.addClass(name, bytes);