为什么java需要Class.forName或动态加载?

时间:2011-09-15 02:31:29

标签: java

说。 jdbc驱动程序需要Class.forName来执行类的静态块。 为什么不把它作为一个类字段运行?

3 个答案:

答案 0 :(得分:2)

Class.forName()保证在您调用它时初始化类。你打算怎么做?您是否可以在不指定局部变量的情况下声明局部变量,例如com.foo.Driver d;?把它变成一个成员变量呢?你需要实际分配吗?关于如何以及何时加载类,规范是什么?你真的想要考虑一下,或者只是打电话给Class.forName()吗?

在相关的说明中,不再需要使用许多JDBC驱动程序来执行此操作。 DriverManager now uses the ServiceLoader mechanism用于识别和加载符合要求的驱动程序类。

答案 1 :(得分:1)

JDBC的整个想法是不依赖于一个特定的驱动程序或实现。我们的想法是您可以使用JDBC并在运行时配置任何可用的驱动程序。为此,您需要按名称加载驱动程序并使用JDBC方法。不幸的是,JDBC并没有抽象出数据库之间的所有差异,例如错误代码,而切换到未经测试的数据库可能不是一个好主意。

您可以认为,对于所有库,您可以在编译时使用它们,并且不会在wim上更改数据库,而无需进行最少的重新测试和重新部署应用程序。在这种情况下,链接到特定的驱动程序(而不是使用Class.forName)可能是一件好事,因为它会强迫您(或任何人这样做)更多地考虑更改并遵循您的测试过程。

答案 2 :(得分:0)

使用技术加载除反射之外的JDBC驱动程序是不切实际的。 (虽然有不同的方法可以做到这一点)。有很多JDBC驱动程序,应用程序可能无法使用实现代码。