我正在将我的代码从 JDK 8 移动到 Open JDK 12。这样做时,我面临以下问题:
java.lang.NoSuchFieldException: scl
在尝试调用 ClassLoader.class.getDeclaredField("scl") 时。这在 Java 8 中运行良好,但在较新的 Java 版本中不再适用。
我做了一些发现,并认为这与反射的工作方式和使用内部 Java 包的方式有关,自 Java 8 以来发生了变化。
Set<URL> classLoaderUrls = computeClassLoaderUrls();
ClassLoader bootstrapClassLoader = ClassLoader.getSystemClassLoader().getParent();
this.classLoader = new URLClassLoader(classLoaderUrls.toArray(new URL[classLoaderUrls.size()]), bootstrapClassLoader);
Field systemClassLoaderField = ClassLoader.class.getDeclaredField("scl");
systemClassLoaderField.setAccessible(true);
this.initialSystemClassLoader = (ClassLoader) systemClassLoaderField.get(null);
systemClassLoaderField.set(null, this.classLoader);
我想知道,如果访问这些classloader
及其字段的方式发生了变化,还是应该使用其他字段而不是scl
. 谢谢