我有依赖于库 X 的实用程序类 U,并且必须放入一个包中,该包将用于具有 X 的程序(它应该做它的正常工作)和没有 X 的地方(它不应该做任何事情)。在不将班级一分为二的情况下,我找到了一个解决此问题的简单模式:
package foo;
import bar.MisteriousX;
public class U {
static private boolean isXPresent = false;
static {
try {
isXPresent = (null != U.class.getClassLoader().loadClass("bar.MisteriousX"));
} catch (Exception e) {
// loading of a sample X class failed: no X for you
}
}
public static void doSomething() {
if (isXPresent) {
new Runnable() {
public void run() {
System.err.println("X says " + MisteriousX.say());
}
}.run();
} else {
System.err.println("X is not there");
}
}
public static void main(String args[]) { doSomething(); }
}
使用这种模式,U 需要 X 存在才能编译,但在有或没有 X 存在的情况下运行时都按预期工作。除非对 X 库的所有访问都在内部类中,否则此代码会启动类加载器异常。
问题:是否保证导入解析在任何地方都能像这样工作,还是取决于 JVM/ClassLoader 实现?这有一个既定的模式吗?上面的代码片段是否太骇人听闻而无法投入生产?