有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java两个具有相同类路径且行为不同的URLClassloader

我的处境是,这是一个例外

this.class.classLoader.loadClass("X") // fine
this.class.classLoader.loadClass("X").getMethods() // ClassNotFoundException for Y

但以下是可以的

def MyClassLoader = new URLClassLoader(this.class.classLoader.getURLS())
MyClassLoader.loadClass("X").getMethods() // fine

什么能解释这一点?这些都是在运行gradle插件时出现的,classloader是一个来自gradle的VisitableURLClassLoader,位于7个classloader链中。我的类路径上没有X或Y的多个副本

我所能想象的是,假设类装入器链是C1>;C2>;C3>;C4>;C5>;C6>;C7,其中C7是我的类加载器。然后它可以通过C3加载类,比如说,但在C4中找到Y,因为类是用C3加载的,所以它在C4中找不到Y。这(对我来说)是有意义的,但我不知道如何调试它


共 (1) 个答案

  1. # 1 楼答案

    这是我唯一的想象。我应该测试一下。类加载器C位于类加载器链中,X可以在父类加载器P中找到,而Y只能在C中找到。由于X是通过P加载的,它在P中查找Y,但没有找到,因此出现了异常