Java 运行时依赖项与编译时依赖项

Java 运行时依赖项与编译时依赖项,java,dependencies,Java,Dependencies,它们在应用程序中都很常见。但是用运行时依赖项替换编译时依赖项是可能的,我看到很多代码都是这样做的。例如,使用反射。它们的利弊是什么?我们是否应该尽可能避免编译时(运行时)依赖关系?编译与运行时的一个例子是在编译时使用的slf4j api和在运行时使用的slf4j-log4j。在本例中,我们讨论的是静态绑定,这是最快的方式 像commons日志到log4j这样的动态链接将是您的反映,因为调用是在运行时动态进行的。最糟糕的方式,但如果您考虑commons lang Equal和HashBuilder

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

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

像commons日志到log4j这样的动态链接将是您的反映,因为调用是在运行时动态进行的。最糟糕的方式,但如果您考虑commons lang Equal和HashBuilder函数,有时是必要的,有时是非常优雅的

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

所以。如果您确实知道要调用什么,或者您对要调用的内容有很强的了解,请改用接口。它的方式更快,可预测和安全。想想国际奥委会

更让人困惑的是,还有一些运行时依赖项,它们在运行时不满足。例如,log4j上下文侦听器需要一个servlet实现。但若您并没有在运行时调用它,那个么就不必麻烦了。Hibernat具有dom4依赖项,但如果只使用注释s,则不需要它。 然后,您可以故意对类进行阴影处理,将其注入包结构中。如果您的库使用使用使用默认可见性的类编写内容,那么这很方便。但这是静态绑定。注意:在安全上下文中,这称为混合匹配攻击


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

。。。反射很慢。@DaveNewton-True。说得好。