J2SE 接口规范和这些接口的实现
J2SE interfaces specifications and implementations of those interfaces
出于某些原因我正在查看 rt.jar,在那里我看到了一些包,例如 java.sql.* 等等。
在我们编写的典型 jdbc 程序中(例如,对于连接 class):
import java.sql.Connection;
根据文档,java.sql.Connection 是接口,不是具体实现,java.sql.Connection 在 rt.jar.
中
当我们编写 jdbc 程序时,我们需要 jdbc 驱动程序,据我所知 jdbc 驱动程序实现接口(例如 java.sql.Connection)。
因此,当我们编写典型的 java 程序时:(并加载 jdbc 驱动程序)
import java.sql.Connection;
--> java.sql。连接来自 rt.jar 或来自驱动程序 classes.
据我猜测,在这种情况下 java.sql。连接必须来自 rt.jar(作为接口),实际实现来自驱动程序 classes.
如果我的假设是正确的,通常我们是否需要包含具有接口定义的 jar 以包含导入。
例如,考虑这种情况:
package com.vipin.myinterface;
public interface Interface1 {
public void print();
}
而如果我们将上面的接口打包为interface1.jar.
假设Concrete1.java实现了这个接口:
package com.vipin.concrete1;
public class Concrete1 implements Interface1 {
public void print () {
//code
}
}
并将此打包在 jar 中 --> concrete1.jar.
现在,假设我正在编写一个使用 print() 方法的应用程序,那么我需要包含这两个 jar 吗?
java.sql.Connection
的情况是驱动程序为此接口和其他接口(如 java.sql.Statement
、java.sql.ResultSet
等)提供了实现 classes。将接口绑定到正确的 class 实现的所有 魔法 都发生在方法 DriverManager#getConnection
中,它调用一个内部方法 private static Connection getConnection(String url, java.util.Properties info, Class<?> caller) throws SQLException
来初始化java.sql.Connection
.
的正确实例
当然,您可以在代码中使用类似的方法,将反射用于:
- 找到接口的正确实现
- 如果有适当的实现,请创建此 class 的实例。
- Return 这个 class 的实例一旦初始化并且 运行.
- 如果找不到 class 或有任何初始化问题,则抛出适当的异常。
请不要认为只创建一个包含接口的 jar 和另一个包含此接口实现 classes 的 jar 会自动为您即时连接,这不会发生。
出于某些原因我正在查看 rt.jar,在那里我看到了一些包,例如 java.sql.* 等等。
在我们编写的典型 jdbc 程序中(例如,对于连接 class):
import java.sql.Connection;
根据文档,java.sql.Connection 是接口,不是具体实现,java.sql.Connection 在 rt.jar.
中当我们编写 jdbc 程序时,我们需要 jdbc 驱动程序,据我所知 jdbc 驱动程序实现接口(例如 java.sql.Connection)。
因此,当我们编写典型的 java 程序时:(并加载 jdbc 驱动程序)
import java.sql.Connection;
--> java.sql。连接来自 rt.jar 或来自驱动程序 classes.
据我猜测,在这种情况下 java.sql。连接必须来自 rt.jar(作为接口),实际实现来自驱动程序 classes.
如果我的假设是正确的,通常我们是否需要包含具有接口定义的 jar 以包含导入。
例如,考虑这种情况:
package com.vipin.myinterface;
public interface Interface1 {
public void print();
}
而如果我们将上面的接口打包为interface1.jar.
假设Concrete1.java实现了这个接口:
package com.vipin.concrete1;
public class Concrete1 implements Interface1 {
public void print () {
//code
}
}
并将此打包在 jar 中 --> concrete1.jar.
现在,假设我正在编写一个使用 print() 方法的应用程序,那么我需要包含这两个 jar 吗?
java.sql.Connection
的情况是驱动程序为此接口和其他接口(如 java.sql.Statement
、java.sql.ResultSet
等)提供了实现 classes。将接口绑定到正确的 class 实现的所有 魔法 都发生在方法 DriverManager#getConnection
中,它调用一个内部方法 private static Connection getConnection(String url, java.util.Properties info, Class<?> caller) throws SQLException
来初始化java.sql.Connection
.
当然,您可以在代码中使用类似的方法,将反射用于:
- 找到接口的正确实现
- 如果有适当的实现,请创建此 class 的实例。
- Return 这个 class 的实例一旦初始化并且 运行.
- 如果找不到 class 或有任何初始化问题,则抛出适当的异常。
请不要认为只创建一个包含接口的 jar 和另一个包含此接口实现 classes 的 jar 会自动为您即时连接,这不会发生。