当我们动态加载一个.class类文件时,需要使用反射来访问类中定义的方法是否正确?
当我们在 Java 程序中使用 JDBC 驱动时,
- 如果我是对的,JDBC 驱动程序也在后台动态加载。
- 但我们永远不需要使用反射来访问 JDBC 驱动程序中定义的方法。相反,我们
导入 java.sql
并访问java.sql
中定义的类和方法。
在引擎盖下,是否正在进行反射?如果不是,它如何在没有反射的情况下工作?
一般来说,当我们动态加载一个.java类文件时,我们如何消除或隐藏使用反射来访问类中定义的方法,就像JDBC驱动程序一样?
顺便问一下,JDBC 驱动程序是否准确地定义了一个类?
谢谢。
最佳答案
JDBC驱动需要实现java.sql.Driver
接口(interface)(例如 oracle.jdbc.OracleDriver
)。除此之外,JDBC 驱动程序代码只是普通的 Java 代码。它可以使用反射或任何其他 Java 语言功能。由驱动程序供应商决定是否值得,例如使用 Java 8 中引入的类将使其仅与 Java 8+ 兼容。
什么是和不是动态加载取决于 JVM 和 ClassLoader
的实现。某些技术(如 OSGI)通过实现允许卸载部分应用程序的 ClassLoader
来提供更大的灵 active 。
加载 JDBC 驱动程序类应该很少发生,并且由 JVM 缓存,因此加载驱动程序的反射调用的成本应该可以忽略不计。单个 SELECT 1
查询的开销将比加载驱动程序字节码高出几个数量级。
关于java - 在 Java 程序中使用 JDBC 驱动程序是否可以在没有反射的情况下工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51314960/