به جز اینکه وقتی اون قسمت Class.forName رو حذف کنیم و هنوز جوابی ندارم براش، اما برای متد بدون تخصیص به متغیر فکر میکنم به جواب رسیدم. فقط دوستان تصحیح کنند اگر اشتباه بود:
از اونجایی که متد DriverManger.getConnection استاتیک است، پس فیلدهای استاتیکی استفاده کرده. که از هر جایی با تغییر این فیلد ها بدون ساخت آبجکت، میتونیم در طول اجرای برنامه به مقادیر دسترسی داشته باشیم.
حالا کد com.mysql.jdbc.Driver رو ببینید :
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
// ~ Static fields/initializers
// ---------------------------------------------
//
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
// ~ Constructors
// -----------------------------------------------------------
/**
* Construct a new driver and register it with DriverManager
*
* @throws SQLException
* if a database error occurs.
*/
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
}
خب تو خط
java.sql.DriverManager.registerDriver(new Driver());
میبینیم مستقیم از متد استاتیک registerDriver کلاس DriverManager استفاده کرده ( بیرون از کانستراکتور هم نوشته تا نیازی به new کردن نباشه و با forName اجرا بشه ) و آبجکتی از خودش ( مثلا اینجا درایور mysql بوده پس یکی از خودش new کرده ) به عنوان پارامتر داده. متد registerDriver هم میگه :
public static synchronized void registerDriver(java.sql.Driver driver) throws SQLException {
...
registeredDrivers.addIfAbsent(new DriverInfo(driver));
درایور جدید رو به لیست اضافه کن.
فکر میکنم واضح شد. حداقل برای من تا اینجاش واضح بود.
فقط سوالی که میمونه اینه که بدون Class.forName چطور DriverManager.getConnection باز هم تشخیص میده؟!!!