• Java通过接口或者抽象类调用方法的时候,怎么知道调用的是哪个实现类里的方法?


    用对象的 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 }
  • 相关阅读:
    改变UITabbar顶部分割线颜色
    UITableViewCell添加点击时改变字体的颜色、背景、图标
    【转】有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?
    AFNetworking https自签名证书 -1012 解决方案
    关于AFNetWorking 2.5.4之后版本编译报错问题解决方案
    UIImageView 使图片圆形的方法
    关于使用IQKeyBoardManager键盘还是被遮挡的问题解决方案
    关于ios7 以上版本 view被导航栏遮挡的问题 解决方案
    手动导入第三方工程/类库
    “请不要直接访问超全局$_GET数组”
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/11610825.html
Copyright © 2020-2023  润新知