在1.7中的javax.sql.CommonDataSource中添加了新方法

Beg*_*moT 24 java datasource

尝试针对java 1.7编译我的应用程序我发现在javax.sql.CommonDataSource中添加了一个新方法(在jsDataSource中也是如此) - .getParentLogger().您可以将CommonDataSource:1.7CommonDataSource进行比较:1.6

对我来说,这种变化肯定会破坏向后兼容 例如,我的应用程序(包含DataSource的实现)甚至不会在没有代码更改的情况下针对1.7进行编译.

根据我的观点,这应该是非常有力的理由 - 但我不能google甚至一个.有人可以解释这种变化背后的原因吗?应该如何处理它 - 对我而言,这是我第一次遇到与java的向后不兼容,所以我这里没有任何"最佳实践"......

Dan*_*ruz 7

如果您还没准备好支持编译Java 7的应用程序,您仍然可以使用Java 7编译器编译Java 1.6.您将需要安装Java 1.6运行时环境(或SDK).如果您尝试使用Java 7编译器编译MyDataSource.java实现存根的类DataSource,您可能会看到以下内容:

$ java -version 
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) Server VM (build 21.0-b17, mixed mode)
$ javac -version
javac 1.7.0
$ javac MyDataSource.java 
MyDataSource.java:7: error: MyDataSource is not abstract and does not override abstract method getParentLogger() in CommonDataSource
public class MyDataSource implements DataSource {
       ^
1 error
Run Code Online (Sandbox Code Playgroud)

您需要告诉编译器您要使用为Java 1.6编写的源文件,生成Java 1.6字节码以及在何处查找Java 1.6运行时JAR:

$ javac -source 1.6 -target 1.6 -bootclasspath <path to Java 1.6 JRE>/lib/rt.jar MyDataSource.java 
$ file MyDataSource.class 
MyDataSource.class: compiled Java class data, version 50.0 (Java 1.6)
$ javap MyDataSource
Compiled from "MyDataSource.java"
public class MyDataSource implements javax.sql.DataSource {
  public MyDataSource();
  public java.io.PrintWriter getLogWriter() throws java.sql.SQLException;
  public void setLogWriter(java.io.PrintWriter) throws java.sql.SQLException;
  public void setLoginTimeout(int) throws java.sql.SQLException;
  public int getLoginTimeout() throws java.sql.SQLException;
  public <T extends java/lang/Object> T unwrap(java.lang.Class<T>) throws java.sql.SQLException;
  public boolean isWrapperFor(java.lang.Class<?>) throws java.sql.SQLException;
  public java.sql.Connection getConnection() throws java.sql.SQLException;
  public java.sql.Connection getConnection(java.lang.String, java.lang.String) throws java.sql.SQLException;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您的代码在Java 7上运行,这不会爆发吗? (2认同)

esk*_*tos 6

首先在没有@Override注释的情况下添加请求的新方法.

如果您不介意支持新方法,只需抛出SQLFeatureNotSupportedException.

如果要包装另一个DataSource并希望支持6和7,则使用反射来调用方法(如果存在).