当我在 spring 的源代码中挖掘问题时,我发现了以下内容:
public abstract class RequestContextHolder {
private static final boolean jsfPresent =
ClassUtils.isPresent("javax.faces.context.FacesContext",
RequestContextHolder.class.getClassLoader());
然后在一个方法中:
if (jsfPresent) {
attributes = FacesRequestAttributesFactory.getFacesRequestAttributes();
}
工厂定义为:
/**
* Inner class to avoid hard-coded JSF dependency.
*/
private static class FacesRequestAttributesFactory
这显然是有效的,因为内部类在需要时才被“触及”,并且此时可以确定 JSF 存在于类路径上。
现在,我想知道这是否是适用于其他情况的好方法。例如,此方法意味着编译时依赖。
那么,有两个问题:
- 除了编译时依赖性之外,这种方法还有什么缺点
- 是否有更好的方法来防止对 API 的显式依赖,同时仍然使用它。
最佳答案
问题中的代码对我来说看起来很干净。 我能想到的避免编译时间依赖性的唯一方法是使用反射。尝试按名称加载类,如果存在,请搜索您要查找的方法。
反射(reflection)对我来说听起来更糟糕。
关于java - 避免显式依赖 API 的正确方法,同时仍然使用它(如果存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2087097/