我正在寻找一种从java.sql.Connection对象中获取密码的方法。我知道DatabaseMetaData对象中有一个getUserName()方法,但不幸的是没有对应的getPassword()方法。使用Netbeans中的调试器,我可以看到密码的字段,因此必须有一种使用反射获取这些信息的方法,但到目前为止我还无法弄清楚如何做到。
我正在寻找一种从java.sql.Connection对象中获取密码的方法。我知道DatabaseMetaData对象中有一个getUserName()方法,但不幸的是没有对应的getPassword()方法。使用Netbeans中的调试器,我可以看到密码的字段,因此必须有一种使用反射获取这些信息的方法,但到目前为止我还无法弄清楚如何做到。
正如我所评论的,唯一的方法就是查看代码。例如,对于使用最新驱动程序(5.1.15)的MySQL,您可以像这样获取密码:
public static void main(String[] args) throws Exception{
ConnectionImpl con = (ConnectionImpl) DriverManager.getConnection("jdbc:mysql://localhost:3908/mydb?user=edalorzo&password=mandrake");
System.out.println(con.getProperties().get("password"));
con.close();
}
但是为了实现这一点,您需要了解类继承结构和其实现细节。
其他数据库很可能会有所不同。如果您使用的数据库是开源的,比如MySQL,您可以了解内部结构的细节并找到检索密码的方法。
由于用户和密码作为Map传递给驱动程序,因此JDBC的实现者负责提供它。
一种了解密码的方式是扩展驱动程序并包含密码。
class CustomDriver extends ImplementerDriver {
@Override
public Connection connect(String url, Properties info) throws SQLException {
super.connect(url, info);
// Extract password from info.
}
public String getPassword() {
....
}
}