0

以下堆栈跟踪中第 29 行的 createController 具有 clazz.getClasslo

protected Object createController(Injector injector, String controllerClassFullName) {
    Class<?> clazz = classLoader.clazzForName(controllerClassFullName);
    return injector.getInstance(clazz); //line 29!!!!
}

loadClass online 521 正在加载上述“clazz”变量的构造函数的类,但未从 CompilingClassLoader 加载。它以某种方式跳过它。构造函数有三个参数,所有参数都是从 CompilingClassLoader 加载的,除了最后一个:(

这是我正在谈论的构造函数(您可以在堆栈跟踪中看到它调用 getDeclaredConstructors)

@Inject
public CustomerController(
        HashCreator hashCreator,
        TokenGenerator tokenGenerator,
        DataClientProxy clientProxy
) {
    this.hashCreator = hashCreator;
    this.tokenGenerator = tokenGenerator;
    this.clientProxy = clientProxy;
}

最后是堆栈跟踪

loadClass:521, ClassLoader (java.lang)
getDeclaredConstructors0:-1, Class (java.lang)
privateGetDeclaredConstructors:3137, Class (java.lang)
getDeclaredConstructors:2357, Class (java.lang)
forConstructorOf:245, InjectionPoint (com.google.inject.spi)
create:115, ConstructorBindingImpl (com.google.inject.internal)
createUninitializedBinding:706, InjectorImpl (com.google.inject.internal)
createJustInTimeBinding:930, InjectorImpl (com.google.inject.internal)
createJustInTimeBindingRecursive:852, InjectorImpl (com.google.inject.internal)
getJustInTimeBinding:291, InjectorImpl (com.google.inject.internal)
getBindingOrThrow:222, InjectorImpl (com.google.inject.internal)
getProviderOrThrow:1040, InjectorImpl (com.google.inject.internal)
getProvider:1071, InjectorImpl (com.google.inject.internal)
getProvider:1034, InjectorImpl (com.google.inject.internal)
getInstance:1086, InjectorImpl (com.google.inject.internal)
createController:29, DevLoader (org.webpieces.devrouter.impl)

世界上的前两个参数是如何从 CompilingClassLoader 加载的,而第三个构造函数是从普通的 ClassLoader 加载的。我认为任何子类都应该通过与父类相同的类加载器来加载?

(由于某种原因,我正在尝试解决此问题,CompilingClassLoader 缺少加载该类,导致非常有趣,例如存在由不同类加载器加载的两个 DataApi.class 对象)。

嗯,当我深入挖掘时,我发现我可以调用 clazz.getMethods() 但是当我调用 clazz.getDeclaredConstructors() 时,我得到一个 ClassCircularityError。真正有趣的是 CustomerController 或 DataClientProxy 扩展任何人,所以这真的很奇怪。

院长

4

1 回答 1

0

肮脏。因此,该文件的包名称错误。虽然 eclipse 不允许这样做并且 intellij 将其标记为红色,但 gradle 和 java 让它编译得很好但是当我们寻找源代码时,我们找不到源代码所以它最终我们无法通过 CompilingClassLoader 加载它导致一个非常令人困惑的问题。我什至不能抛出异常告诉开发人员包错误,因为我只收到类名并且不知道包名是否错误,因为所有类都通过这个类加载器。好。

于 2020-05-28T22:51:41.987 回答