这在技术上可能是一种可行的方法,但是像其他海报一样,我敦促您考虑这是否是解决您的问题的正确方法(并且您已经问过如何实施此解决方案而不是如何解决您的原始问题,所以我无法真正告诉您您是否走在正确的轨道上)。
您是否可能有兴趣选择依赖库但不强迫您的客户提供它?根据您的构建系统,这并不难实现。例如,Maven 允许您将依赖项指定为<scope>optional</scope>
,这允许您针对它编译代码,但不将其包含为传递依赖项。
话虽如此,确实可以选择性地依赖某些库并在它们不可用时采取替代路线。以我的经验,这最容易通过隐藏界面后面的细节来完成。
例如,我有一个 ProfilingAdvisor 接口,它与 AspectJ 方面一起工作,以分析我用自定义注释标记的方法。我有一个名为 SimpleProfilingAdvisor 的接口的基本实现,它没有外部依赖项。我有一个更详细的实现,它使用 Java Simon 库获取更多信息,称为 SimonProfilingAdvisor。
如果客户选择包含 Java Simon 库,他们将获得“更好”的实现。如果他们选择不这样做,则实施“基本”方法(在您的情况下可能什么都不做)。
我的代码总是对接口 ProfilingAdvisor 进行操作,但是在实例化这种类型的实例变量时,我必须确定可选的 Simon 库是否在类路径上:
private ProfilingAdvisor advisor;
/* ... */
try {
Class.forName("org.javasimon.SimonManager");
this.advisor = new SimonProfilingAdvisor();
} catch (ClassNotFoundException classNotFoundException) {
this.advisor = new SimpleProfilingAdvisor();
}
最后一点。虽然您可以按照您的建议使用反射来确定一个类的存在,但我想不出在实例化后通过反射方法访问它可以获得什么,并且您实际上绕过了编译器的检查能力您对方法名称等的拼写。
至少,您应该使用一个构建系统,该系统允许您在编译时针对库进行编译,但以后不一定将其包含在您的发行版中(例如,Maven)。