在 Java 程序中使用 JDBC 驱动程序是否可以在没有反射的情况下工作?



当我们动态加载.class类文件时,我们需要使用反射来访问类中定义的方法是否正确?

当我们在 Java 程序中使用 JDBC 驱动程序时,

  • 如果我是对的,JDBC 驱动程序也在后台动态加载。
  • 但是我们永远不需要使用反射来访问 JDBC 驱动程序中定义的方法。相反,我们import java.sql并访问java.sql中定义的类和方法。

在引擎盖下,是否有反射正在发生?如果没有,它如何在没有反思的情况下工作?

通常,当我们动态加载.java类文件时,如何消除或隐藏使用反射来访问类中定义的方法,就像JDBC驱动程序一样?

顺便问一下,JDBC 驱动程序是否准确定义了一个类?

谢谢。

JDBC驱动程序需要实现java.sql.Driver接口(例如oracle.jdbc.OracleDriver)。除此之外,JDBC驱动程序代码只是普通的Java代码。它可以使用反射或任何其他 Java 语言功能。由驱动程序供应商决定是否值得,例如,使用 Java 8 中引入的类将使其仅与 Java 8+ 兼容。

动态加载和不动态加载的内容取决于 JVM 和ClassLoader的实现。某些技术(如 OSGI)通过实现允许卸载应用程序部分的ClassLoader来提供更大的灵活性。

加载JDBC 驱动程序类应该很少发生,并且由 JVM 缓存,因此加载驱动程序的这一次反射调用的成本应该可以忽略不计。单个SELECT 1查询的成本将比加载驱动程序字节码高出几个数量级。

从 JDBC 4.0 开始,不再需要执行任何与反射相关的调用来使用 JDBC 驱动程序,因为在类路径上发现的任何驱动程序都会自动加载。

如果您的代码必须支持 JDBC 4 之前的代码,或者如果您的 JDBC 驱动程序不在类路径上,则必须调用Class.forName来加载驱动程序。

在引擎盖下,是否有反射正在发生?

JDBC4.0 使用服务提供程序机制来定位 JDBC 驱动程序,而无需直接进行反射。但是,在某些时候,需要加载 JDBC 驱动程序类,因此必须执行反射调用。

最新更新