运行时依赖性与编译时间依赖性

时间:2014-02-11 18:23:04

标签: java dependencies

它们在应用程序中都很常见。但是可以用运行时依赖性替换编译时依赖项,我看到很多代码都在这样做。例如,使用反射。它们的缺点和优点是什么?我们应该尽可能地避免编译时(运行时)依赖吗?

1 个答案:

答案 0 :(得分:0)

编译与运行时的一个例子是slf4j-api,它在编译时使用,slf4j-log4j在运行时使用。在这个例子中,我们讨论的是静态绑定,这是最快的方法。

动态链接(如commons-logging to log4j)将是您的反映,因为调用是在运行时动态完成的。最糟糕的方式,但有时是必要的,有时非常优雅,如果你考虑公共郎等和HashBuilder功能。

Refection为您提供了一个整洁的能力,可以在构建时调用您不知道的内容,但它应该仅限于框架代码。有人会称它为程序员懒惰的最高级别:-)

因此。如果您确实知道,要调用的内容,或者您​​想要调用的内容,请使用“接口”。它更快,更可预测,更安全。想想IoC。

为了增加您的困惑,还存在运行时依赖性,这些依赖性在运行时未得到满足。例如,log4j上下文侦听器需要servlet实现。但是如果你没有在运行时调用它,你一定不要打扰。 Hibernat具有dom4依赖性,但如果仅使用注释,则不需要它。 然后你可以故意影子类将它注入到包结构中。如果您的库使用默认可见性的类编写的内容,这会很方便。但AFAIK这是静态绑定。注意:在安全上下文中,这称为混合匹配攻击。

回到你的问题:尽可能使用静态绑定。