<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)

    文章分類

    相冊

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲美女视频一区| 亚洲爆乳AAA无码专区| 97视频热人人精品免费| 久久亚洲精品成人无码| 亚洲精品中文字幕乱码三区| 免费国产作爱视频网站| 视频一区二区三区免费观看| 精品亚洲综合在线第一区| 国产h视频在线观看免费| 精品一区二区三区高清免费观看 | 中国极品美軳免费观看| 亚洲午夜国产精品无卡| 亚洲人午夜射精精品日韩| 亚洲免费观看网站| 好男人资源在线WWW免费| 亚洲第一区二区快射影院| 亚洲一区日韩高清中文字幕亚洲| 日本最新免费网站| 国产精品1024在线永久免费| 亚洲天堂男人影院| 亚洲国产成人片在线观看 | 亚洲五月综合网色九月色| 黑人大战亚洲人精品一区| 岛国av无码免费无禁网站| 精品免费视在线观看| 免费在线观看亚洲| 亚洲AV无码成人专区| 亚洲一区二区中文| 久久久久亚洲精品男人的天堂| 成人免费毛片内射美女-百度| 久久精品视频免费播放| 一级一级一片免费高清| 亚洲AV成人精品一区二区三区 | 永久在线观看免费视频| 污视频网站在线免费看| 亚洲色无码国产精品网站可下载| 亚洲免费精彩视频在线观看| 亚洲色图综合在线| 亚洲欧洲自拍拍偷精品 美利坚| 成人毛片手机版免费看| 中文字幕无码播放免费|