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 }
复制代码

 

posted @   拾月凄辰  阅读(5501)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
历史上的今天:
2018-09-30 层序创建二叉树
2018-09-30 求二叉树的高度
2018-09-30 输出二叉树中的所有叶子节点
2018-09-30 Brute-Force算法
2018-09-30 循环队列(数组实现)
2018-09-30 中缀表达式转换成后缀表达式(只适用于加减乘除运算)
2018-09-30 顺序栈
点击右上角即可分享
微信分享提示
主题色彩