用对象的 getClass()
方法获得它的类,之后就可以随意去判断这是哪个实现类了。
比如代码1-1所示的JDBC连接池的代码,我们想要知道conn调用的close方法是释放连接还是归还连接,
我们可以打印conn.getClass()::
Connection conn = JDBCUtils.getConnection();
System.out.println(conn.getClass());
结果为class com.alibaba.druid.pool.DruidPooledConnection,所以这个Connection的实现类其实是DruidPooledConnection,查看源码可以知道DruidPooledConnection的close方法是归还连接到连接池,而不是释放连接。
代码1-1:
1 package cn.itcast.utils; 2 3 import com.alibaba.druid.pool.DruidDataSourceFactory; 4 5 import javax.sql.DataSource; 6 import java.io.IOException; 7 import java.sql.Connection; 8 import java.sql.ResultSet; 9 import java.sql.SQLException; 10 import java.sql.Statement; 11 import java.util.Properties; 12 13 public class JDBCUtils { 14 private static DataSource ds; 15 16 static{ 17 Properties pro = new Properties(); 18 try { 19 // 1.加载配置文件 20 pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); 21 // 2.获取DataSource 22 ds = DruidDataSourceFactory.createDataSource(pro); 23 } catch (IOException e) { 24 e.printStackTrace(); 25 } catch (Exception e) { 26 e.printStackTrace(); 27 } 28 } 29 30 31 public static DataSource getDataSource(){ 32 return ds; 33 } 34 /** 35 * 获取连接 36 * @return 37 * @throws SQLException 38 */ 39 public static Connection getConnection() throws SQLException { 40 return ds.getConnection(); 41 } 42 43 44 public static void close(Statement stmt, Connection conn){ 45 if(stmt != null){ 46 try { 47 stmt.close(); 48 } catch (SQLException e) { 49 e.printStackTrace(); 50 } 51 } 52 53 if(conn != null){ 54 try { 55 conn.close(); 56 } catch (SQLException e) { 57 e.printStackTrace(); 58 } 59 } 60 } 61 62 63 public static void close(ResultSet rs, Statement stmt, Connection conn) { 64 if (rs != null) { 65 try { 66 rs.close(); 67 } catch (SQLException e) { 68 e.printStackTrace(); 69 } 70 } 71 if (stmt != null) { 72 try { 73 stmt.close(); 74 } catch (SQLException e) { 75 e.printStackTrace(); 76 } 77 } 78 79 if (conn != null) { 80 try { 81 conn.close(); 82 } catch (SQLException e) { 83 e.printStackTrace(); 84 } 85 } 86 } 87 88 89 }