CompilingClassLoader有趣,在这种情况下如何从不同的类加载器加载子类的任何想法?

问题描述 投票:0回答:1

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

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

在线加载类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.getDeclaredConstructors()时调用clazz.getMethods(),但会收到ClassCircularityError。真正有趣的是,CustomerController或DataClientProxy扩展了任何人,所以这真的很奇怪。

Dean

下面堆栈跟踪中第29行的createController具有clazz.getClasslo受保护的对象createController(Injector injection,String controllerClassFullName){Class> clazz = classLoader ....

java classloader contextclassloader
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.