缺少依赖项时的对象实例化(Java)

缺少依赖项时的对象实例化(Java),java,object,instantiation,classloader,Java,Object,Instantiation,Classloader,伙计们,有人能解释一下下面的场景吗 1) Web应用程序在其lib目录中有module1.jar。该模块中有一个类a: package module1; import module2.B; public interface IA { void methodOk() {} void methodWithB(B param) {} } package module1; import module2.B; public class A implements IA {

伙计们,有人能解释一下下面的场景吗

1) Web应用程序在其
lib
目录中有
module1.jar
。该模块中有一个类
a

package module1;
import module2.B;
public interface IA {   
    void methodOk() {}

    void methodWithB(B param) {}
}

package module1;
import module2.B;
public class A implements IA {
    public A() {}

    //...
void methodWithB(B param) {
    //do job on B
}
}
2)
module2.jar
不存在-它不在类路径中

3) 应用程序能够创建类
A
的对象,尽管它缺少依赖项。在应用程序中,调用方法a.methodOk()

如果你能参考一下这方面的任何规范,那就太酷了。
非常感谢。

因为代码已经编译,所以在您直接使用class
B
之前,它不会抛出错误。从代码的外观来看,实际上并没有使用
B
的实例进行任何操作。

如果A在任何地方都没有使用B,则生成的字节码将没有对module2.B的引用,因此它会被编译掉。不存在依赖项,本例中编译时除外


如果问题不清楚,并且B在A中某处使用,那么我希望看到更多的代码来尝试确定发生了什么。

从类加载器的角度来看它。如果不必加载该类,则不必关心该类的字节码是否丢失

你的问题是,“什么触发了类加载?”

我能想到的两个原因是: -建筑
-静态访问

A在任何地方使用B吗?@Joseph:我已经编辑了#4点。这些类已经编译好了,所以这里没有“编译掉”的内容。引用
B
的字节码仍然存在。简单地说,运行时并不关心
B
,直到您需要使用一个。啊,您是对的-引用存在并且不被追踪。我认为如果不使用它,它首先就不会麻烦在字节码中生成对B的引用。我应该先通过javap检查。我已经编辑了我的#4点。没错,
methodWithB(B参数)
从未被调用。事实上,我错过了一些关于如何创建对象
A
的细节?@Jeremy:你能详细说明一下吗?我的意思是,能够构造对象对我来说是一个惊喜(我缺乏JVM内部知识)…告诉我们
B
的实例在代码中的什么位置构造?请记住,只有在运行时执行的代码才重要。如果从来没有构造过
B
的实例,那么JVM就不需要爆炸。@Jeremy:在构造B的时候不能说你(左comp在工作:),可能不在任何地方。。。您声明类可以在类加载器不知道其所有依赖项的情况下构造。是什么让这成为可能?它背后的逻辑是什么?这是可能的,因为JVM不执行与编译器相同的静态分析。如果JVM(通过类加载器)不需要实际加载类,那么它是否存在就无关紧要了。JVM假设编译器已经完成了它的工作,并且在需要时类将在那里。只是在您的情况下,
B
在程序执行过程中永远不会被调用。@Max:
B
将在您创建新实例以将其传递到方法时被加载。