1

我需要相同的代码才能在具有不同库的不同服务器上工作。

因此,例如 serverB 包含 libraryB。ClassB 而 serverA 没有。

为了使代码在两台服务器上都能正常工作,我没有显式地导入该类,而是仅在需要时才声明它。例如:

If(serverB) {
   libraryB.ClassB foo = new libraryB. ClassB();

   foo.doSomething();
}else{
   whatever();
}

这通常对我有用,但现在我在新服务器上安装了我的代码,我得到了 NoClassFoundException。我反编译了我的类并导入了库。为什么?我可以避免吗?

谢谢

4

1 回答 1

0

从包中导入某些类与尝试在运行时定位该类无关。每当 JVM 检测到需要类似的类ClassB时,它就会尝试定位并加载该类。

何时发生这种情况的确切说明有一些复杂性,但无论您编写完全限定libraryB.ClassB还是缩写ClassB和导入语句都没有区别。并且定位该类肯定会发生在 JVM 甚至尝试执行包含对该类的引用的代码之前(就像您向我们展示的代码片段)。

不要被包含import语句的反编译误导。您可以自己尝试并比较您的代码的两个版本,一个使用 import 编写,另一个使用完全限定的类名。结果将是相同的。这只是反编译器更喜欢短类名的一种方便,因此它总是添加相关的导入语句(只要这不会导致名称冲突)。

很难理解为什么像你这样的代码在没有抛出错误的情况下运行。

于 2021-10-07T18:20:12.123 回答