作者qrtt1 (有些事,有時候。。。)
看板java
標題Re: [問題] 關於動態載入與靜態載入
時間Tue Jun 2 20:51:24 2015
※ 引述《tas72732002 (蔥頭)》之銘言:
: 因為最近在看反射, 看到了動態載入的部分, 想請問一下各位
: 靜態載入, 代表編譯時期其就確定了"可能"載入的class, 一般使用new呼叫稱做靜態載入
: 動態載入, 代表執行時才載入指定的class, 一般透過Class.forName(類別名稱)來進行動態載入
: 不知以上的定義是否有錯誤?
: 此外, 如果已經確定了可能使用的類別, 那還需要動態載入嗎?
: 如程式中有三種情況, 依照不同情況執行,
: if ( args[0] == "aMethod") {
: aMethod demo = new aMethod();
: } else if(args[0] == "bMethod") {
: bMethod demo = new bMethod();
: } else if(args[0] == "cMethod") {
: cMethod demo = new bMethod();
: }
: 這樣我還需要使用動態載入的方法嗎?
: 之前看到使用動態載入的如JDBC的使用,
: 所以我的了解是, 如果不確定要產生的物件是什麼, 可以使用動態載入,
: 但上述情況已經確認會有三種情況, 那還需要使用動態載入嗎?
這情況蠻常見的呦。
拿 JDBC 來說好了,
API 制定者最初在當 JDBC interfaces 時,
並不知道「未來」有哪些人會去實作 Driver interface。
現在
某間公司開發出了一個
「別管 NoSQL 了,你聽過 RMDBS 資料庫嗎?」的 Driver,
而
使用者覺得他很好用,想用這個新型態的 DB 來當作儲存資料的主 DB
於是
使用者,用了某個很好用的 db access layer 的 library
或是 framework,讓使用者可以指定
jdbc url、driverClass,當然還有帳號密碼。
那麼這個超好用的 db access layer 的 library 或 framework
就會使用使用者填好的 driverClass 並叫 classloader 載入它:
Driver driver = Class.forName("
「別管 NoSQL 了,你聽過 RMDBS 資料庫嗎?」
")
這麼一來,
使用者就可以
在 JDBC 這個抽象的介面下,
使用這種新型態的 DB
所以,你在想這問題時,應該沒有想過有這麼多角色,
在不同的時空下,為 JDBC 介面制定與後續的實作分別付出了不同的努力
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.231.238.120
※ 文章網址: https://www.ptt.cc/bbs/java/M.1433249487.A.339.html
※ 編輯: qrtt1 (36.231.238.120), 06/02/2015 20:51:58
※ 編輯: qrtt1 (36.231.238.120), 06/02/2015 20:53:21
※ 編輯: qrtt1 (36.231.238.120), 06/02/2015 20:54:42
推 tas72732002: 了解, 我名詞上好像定義錯誤, 載入分成 06/03 08:30
→ tas72732002: 預先載入和依需求載入 06/03 08:30
→ tas72732002: 需求載入又分顯式和隱式 06/03 08:31
→ tas72732002: 隱式就是透過new, 顯式則使用如Class.forName 06/03 08:32
→ qrtt1: 不需要這麼多名詞啊,只要觀察一下它的行為跟運用情境 06/03 09:30
→ qrtt1: 去理解一下這麼做的理由。硬要落個名詞的話,我大概會說 06/03 09:30
→ qrtt1: 是不是在「編譯期」就決定關係,還是在「執行期」才知道 06/03 09:31
推 LaPass: 專有名詞我都聽不懂...... 可是我都用過 OAO 06/03 09:34
→ qrtt1: 我也是剛剛才知道這麼多新名詞 (汗 06/03 09:36
→ Killercat: 其實自己改寫一下classloader就能解決很多問題啊.... 06/03 10:28
→ Killercat: 不用讓使用者知道顯式隱式,自己inherit一個classloade 06/03 10:29
→ Killercat: r 把這些東西藏起來就好 XD 06/03 10:29
推 tas72732002: 了解 06/03 10:31