【问题标题】:J2SE interfaces specifications and implementations of those interfacesJ2SE 接口规范和这些接口的实现
【发布时间】:2015-05-29 16:00:30
【问题描述】:

由于某些原因,我正在查看 rt.jar,并且在那里我看到了一些包,例如 java.sql.* 等。

在我们编写的典型 jdbc 程序中(例如,对于 Connection 类):

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.Connection 是来自 rt.jar 还是来自驱动类。

据我推测,在这种情况下 java.sql.Connection 必须来自 rt.jar(作为接口),而实际实现来自驱动程序类。

如果我的假设是正确的,通常我们需要包含具有接口定义的 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 吗?

【问题讨论】:

  • @bayou.io 你为什么不写一个答案?
  • @Würgspaß - 因为我很懒? :)
  • @bayou.io 或者可能是因为您无法就该主题给出适当的解释。
  • @Würgspaß 我没有看到这样正确的解释,实际上我只看到两个问题:这是如何完成的?我可以像它一样简单地做到这一点看起来像?
  • @bayou.io 我不是这么说的。您可以知道某些东西是如何工作的,但在向其他人解释这一点时可能会遇到问题。这不会让你变得愚蠢,只是很难表达自己:)

标签: java interface java-7


【解决方案1】:

java.sql.Connection 的情况是驱动程序为此和其他接口(如java.sql.Statementjava.sql.ResultSet 等)提供了实现类。将接口绑定到正确的类实现的所有魔法都发生在方法DriverManager#getConnection 中,该方法调用内部方法private static Connection getConnection(String url, java.util.Properties info, Class<?> caller) throws SQLException,该方法将初始化java.sql.Connection 的正确实例。

当然,您可以在代码中使用类似的方法来使用反射:

  • 找到接口的正确实现
  • 如果有适当的实现,请创建此类的实例。
  • 在初始化并运行后返回此类的实例。
  • 如果找不到类或存在任何初始化问题,则引发适当的异常。

请不要认为只创建一个包含接口的 jar 和另一个包含该接口的实现类的 jar 会自动为您自动连接,这不会发生。

【讨论】:

  • 其实你也可以调用DriverManager#getDriver然后调用Driver#connect,所以如果你必须重新连接你已经有了正确的实现。此外,您可以说每个驱动程序实现都有一个方法acceptURL(...),因此DriverManager 只需询问每个实现并获取接受url 的那个。
  • @NyamiouTheGaleanthrope 我的意思是:您不能只创建一个接口和一个实现,并期望 Java 为您加载实现并即时初始化您的接口。你必须以某种方式做到这一点,Driver#getConnection 也不例外。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 2011-01-08
相关资源
最近更新 更多