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.Statementjava.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 会自动为您即时连接,这不会发生。