gpt4 book ai didi

java - Java 类是如何加载的,我如何确定加载类的位置/时间/原因?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:05:23 28 4
gpt4 key购买 nike

所以我有点理解什么是java ClassLoader is因为它为 JVM 准备编译的 .class 文件。我几乎看不懂how it works因为它试图通过一系列递归调用父类加载器的步骤来加载类。我不明白的是如何确定 ClassLoader。即类加载器是如何选择的?

我现在问这个问题是因为我基本上遇到了以下问题:I can't cast a child class to the implemented interface .

该类如下所示:

public class AccountBoImpl implements AccountBo {
...
}

这是我的(稍微编辑过的)堆栈跟踪的结尾:

15:49:47.269 [DefaultThreadPool-7] ERROR com.company.app.kem.biz.ao - 
java.lang.ClassCastException: com.company.app.department.bo.AccountBoImpl cannot be cast to com.company.domain.core.biz.AccountBo
at com.company.domain.core.biz.AccountBOF.findBySomething(AccountBOF.java:62) ~[Client-1.0.0-SNAPSHOT.jar:na]
at com.company.domain.shared.biz.applogic.balances.SiteAccountBalanceProcessor.setUnbilledUsage(SiteAccountBalanceProcessor.java:347) ~[Domain-1.0.0-SNAPSHOT.jar:na]

这里,AccountBoImpl 和 AccountBo(AccountBoImpl 实现的接口(interface))之间的包是不同的。我想知道是什么决定了这些类的加载方式。例如,当我导入 com.company.app.billing.bo.AccountBo; 时,为什么 AccountBo 加载了 com.company.domain.core.biz 包?我知道在这段代码中的某个时刻,调用了一个 Module 类,它应该初始化类。但是我不确定在这个模块类中寻找什么。

最后,为了弄清楚为什么这个类加载不正确,我假设我需要找出它加载的位置/时间。但是我该怎么做呢?我只知道类是按需加载的(不管这到底意味着什么),但我不知道我将如何解决这个问题。例如,对于一个变量,我可以调试/单步执行代码以查看何时分配变量值。但是对于一个类...?我在找什么?我知道在这个代码库中,我们有遗留代码提供了许多与新代码相同的类,但我如何使用这些信息来解决我的问题?

如果我遗漏了关键信息或者这个问题看起来含糊不清,我提前道歉。我不确定如何解决这个问题,因为我昨天才知道 ClassLoader 存在。

最佳答案

如何解析简单名称 AccountBo 的决定是在编译时做出的。

如果您确实有一个 import com.company.app.billing.bo.AccountBo; 声明您的类,则 implements AccountBo 子句不可能解析为一类不同的包。

并且 ClassCastException 准确地承认了这一点,因为它说您的类不能分配给 com.company.domain.core.biz.AccountBo.

所以类加载器没有问题,错误解析的标识符也没有问题。您的类实现了 com.company.app.billing.bo.AccountBo,但是在类 com.company.domain.core.biz.AccountBOF 的方法 findBySomething 试图将您的类的实例转换为它未实现的 com.company.domain.core.biz.AccountBo

一般来说,使用如此容易混淆的名称的公共(public)类并不是一个好主意。

关于java - Java 类是如何加载的,我如何确定加载类的位置/时间/原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57916027/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com