当前位置: 首页 > 知识库问答 >
问题:

CompilingClassLoader的乐趣,有没有想过在这种情况下子类如何从不同的classloader加载?

龚跃
2023-03-14

下面堆栈跟踪中第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加载的,第三个构造函数是如何从普通类加载器加载的。我认为任何子类都应该通过与父类相同的类加载器来加载?

(由于某种原因,CompilingClassLoader没有加载这个类,导致两个DataAPI.class对象被不同的类加载器加载,这非常有趣)。

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

院长

共有1个答案

周承天
2023-03-14

肮脏。所以,文件的包名是错误的。虽然eclipse不允许这样做,intellij将其标记为red,gradle和java让它编译得很好,但是当我们查找源代码时,我们找不到源代码,因此它最终无法通过CompilingClassLoader加载它,这造成了一个非常混乱的问题。我甚至不能抛出一个这样的异常,告诉开发人员包是错误的,因为我只知道classnames,不知道包名是否是错误的,因为所有类都要通过这个classloader。艾克。

 类似资料:
  • 问题内容: 示例问题: 实体: 用户包含姓名和朋友列表(用户参考) 博客文章包含标题,内容,日期和作者(用户) 需求: 我想要一个显示标题的页面以及指向用户朋友的最近10篇博客的链接。我还希望能够通过较旧的条目继续进行分页。 SQL解决方案: 因此在sql land中,它将类似于: 我能想到的GAE解决方案是: 加载用户,循环浏览好友列表并加载其最新博客帖子。最后合并所有博客文章以查找最新的10个

  • 我不想再使用powermock了。因为junit5开始模拟静态类。因此,我试图摆脱powermock方法。 当我使用PowerMock时,我可以很容易地发现一个具有私有构造函数的类,然后我调用静态方法。 这是我代码的一部分(当我使用PowerMock时) 在我做了MessageValidationUtils.class的间谍对象后,我正在测试这个: 经过一些研究,我找不到任何与监视一个具有私有构造

  • 我想查看项目中的所有类,当我找到一个从“City”派生的类时,我想创建一个该类型的新对象并将其添加到列表中。这允许我添加功能,而无需更新列表。最重要的是,我想在不使用任何库的情况下完成它。我已经找到了类似的主题,但他们使用了org。反思。我希望避免以下情况:

  • 问题内容: 我正在使用以下sql语句对来自两个不同表的两个列中的值求和。该语句可以输出,但不能输出所需的结果。 我的桌子在这里: -- -转储表数据 -- -表格的表格结构 -- -转储表数据 问题答案: 这应该做到这一点:

  • 我已经安装了Android SDK最新版本和Eclipse。但我也想试试Android Studio。 我看过这个和这个帖子,但是那些解决方案改变了Android Studio(一旦下载并安装)使用的SDK实例。我想要的不是下载另一个SDK,当我已经在我的机器上安装了它。

  • 我正在使用分子和流浪汉来部署centos7实例。出于某些原因,我需要使用ssh命令访问分子实例,。然后ssh信息将粘贴到我的VS代码扩充中。 Molecule.yml 上面的IP允许我访问vagrant外的80端口。 但是分子实例IP的ssh命令不起作用。 错误 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 警告:远程主机