<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Aaron Johnson對Class.forName()的解釋


    ??? A reader asked a question via a comment a couple months ago that I didn't really have an answer for (and had always kind of wondered the same thing). In the original post (which showed how to use JDBC with ColdFusion), I used the following snippet of code:

    Class.forName("jdbc.DriverXYZ");
    Connection con = DriverManager.getConnection(url,
    ??"myLogin", "myPassword");

    and the reader wanted to know what the Class.forName(..) method did. The most common answer you'll hear is that it loads the database driver, which, while technically true, is shallow. Where does it get loaded? How does it happen? And why?

    To answer the question I started with the JavaDoc for the Class.forName() method. According to the documentation, the method:

    ... attempts to locate, load, and link the class or interface
    I wasn't perfectly clear on what "locate, load, and link" meant, so I did a little digging through the Java Language Specification. According to chapter 12 of the JLS:
    Loading refers to the process of finding the binary form of a class or interface type with a particular name, perhaps by computing it on the fly, but more typically by retrieving a binary representation previously computed from source code by a compiler, and constructing, from that binary form, a Class object to represent the class or interface.
    Next, again according to the JLS, it must be transformed from it's binary representation to something the Java virtual machine can use, this process is called linking. Finally, the class is initialized, which is the process that executes the static initializer and the initializers for static fields declared in the class.

    So then back to the original problem, when Class.forName() is called with an argument like this:

    Class.forName("org.gjt.mm.mysql.Driver");

    the classloader attempts to load and link the Driver class in the "org.gjt.mm.mysql" package and if successful, the static initializer is run. The MySQL Driver (download the source code) static initializer looks like this:

    static {
    ??try {
    ????java.sql.DriverManager.registerDriver(new Driver());
    ??} catch (SQLException E) {
    ????throw new RuntimeException("Can't register driver!");
    ??}
    }

    So it calls a static method in the java.sql.DriverManager class which apparently registers a copy of itself when it loads.

    So now I understand the where and the how, what about why? To understand the why you have to look at the next line in the initial code example:

    Connection con = DriverManager.getConnection(url,
    ??"myLogin", "myPassword");

    The DriverManager class (view DriverManager source here) returns a database connection given a JDBC URL string, a username and a password. In order to create that connection, the DriverManager class has to know which database driver you want to use. It does that by iterating over the array (internally a Vector) of drivers that have registered with it (ie: the registerDriver(Driver driver) method illustrated above) and calls the acceptsURL(url)) method on each driver in the array, effectively asking the driver to tell it whether or not it can handle the JDBC URL.

    So there you have it. Class.forName explained.

    posted on 2006-11-19 20:44 Tom 閱讀(342) 評論(0)  編輯  收藏 所屬分類: Java

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(1)

    隨筆分類(42)

    隨筆檔案(43)

    文章分類

    相冊

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 麻豆国产人免费人成免费视频| 看亚洲a级一级毛片| 免费视频一区二区| 亚洲精品在线免费观看| 午夜私人影院免费体验区| 特级aa**毛片免费观看| 久久久亚洲精品国产| 好吊妞在线新免费视频| 在线视频网址免费播放| 亚洲国产日韩视频观看| 亚洲中文字幕久久精品无码APP| 成人免费毛片内射美女-百度| 免费观看又污又黄在线观看| 亚洲精品在线不卡| 免费乱理伦在线播放| 久久久久亚洲精品无码网址| 久9热免费精品视频在线观看| 亚洲www77777| 亚洲AV无码成人精品区蜜桃 | 中出五十路免费视频| 亚洲人成网男女大片在线播放| 亚洲一级Av无码毛片久久精品| 在线看片免费不卡人成视频| 99视频免费在线观看| 国产亚洲精久久久久久无码AV| av免费不卡国产观看| 中文字幕一区二区三区免费视频| 亚洲中文精品久久久久久不卡| 亚洲AV无码第一区二区三区| 国产成人免费片在线观看| 亚欧色视频在线观看免费| 东北美女野外bbwbbw免费 | 亚洲色大成WWW亚洲女子| 亚洲国产精品高清久久久| 免费一级肉体全黄毛片| 成视频年人黄网站免费视频| 久久久久国产精品免费网站| 污污污视频在线免费观看| 亚洲欧美日韩综合俺去了| 亚洲日本在线观看网址| 婷婷精品国产亚洲AV麻豆不片 |