看板 java 關於我們 聯絡資訊
※ 引述《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