Re: [問題] 關於動態載入與靜態載入

作者: qrtt1 (有些事,有時候。。。)   2015-06-02 20:51:24
※ 引述《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 介面制定與後續的實作分別付出了不同的努力
作者: tas72732002 (蔥頭)   2015-06-03 08:30:00
了解, 我名詞上好像定義錯誤, 載入分成預先載入和依需求載入需求載入又分顯式和隱式隱式就是透過new, 顯式則使用如Class.forName
作者: qrtt1 (有些事,有時候。。。)   2015-06-03 09:30:00
不需要這麼多名詞啊,只要觀察一下它的行為跟運用情境去理解一下這麼做的理由。硬要落個名詞的話,我大概會說是不是在「編譯期」就決定關係,還是在「執行期」才知道
作者: LaPass (LaPass)   2015-06-03 09:34:00
專有名詞我都聽不懂...... 可是我都用過 OAO
作者: qrtt1 (有些事,有時候。。。)   2015-06-03 09:36:00
我也是剛剛才知道這麼多新名詞 (汗
作者: Killercat (殺人貓™)   2015-06-03 10:28:00
其實自己改寫一下classloader就能解決很多問題啊....不用讓使用者知道顯式隱式,自己inherit一個classloader 把這些東西藏起來就好 XD
作者: tas72732002 (蔥頭)   2015-06-03 10:31:00
了解

Links booklink

Contact Us: admin [ a t ] ucptt.com