缺少依赖项时的对象实例化(Java)
伙计们,有人能解释一下下面的场景吗 1) Web应用程序在其缺少依赖项时的对象实例化(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 {
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
将在您创建新实例以将其传递到方法时被加载。