0

我正在将我的代码从 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. 谢谢

4

0 回答 0