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