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

    文章分類

    相冊

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费精品国自产拍在线播放| 含羞草国产亚洲精品岁国产精品| 伊人免费在线观看| 国产尤物在线视精品在亚洲| 成人黄软件网18免费下载成人黄18免费视频 | 美女无遮挡免费视频网站| 国产免费网站看v片在线| 国产l精品国产亚洲区在线观看| 十八禁视频在线观看免费无码无遮挡骂过 | 三级毛片在线免费观看| 成人免费男女视频网站慢动作| 亚洲免费电影网站| 中文字幕日本人妻久久久免费| 国产成人亚洲精品青草天美| 日韩免费在线视频| 亚洲熟妇色自偷自拍另类| 91视频免费观看| 亚洲图片一区二区| 色播在线永久免费视频网站| 亚洲gv猛男gv无码男同短文| 十八禁无码免费网站| 亚洲三区在线观看无套内射| 日本一区二区免费看| 91嫩草亚洲精品| 搡女人真爽免费视频大全| 深夜特黄a级毛片免费播放| 亚洲午夜国产精品无码老牛影视| 1000部羞羞禁止免费观看视频| 久久久久久久尹人综合网亚洲 | 亚洲人成免费电影| 日本媚薬痉挛在线观看免费| 国产99视频精品免费视频76| 亚洲成在人天堂在线| 日韩吃奶摸下AA片免费观看| 亚洲狠狠综合久久| 一二三四在线观看免费高清中文在线观看 | 午夜老司机免费视频| 一边摸一边桶一边脱免费视频 | 一区二区视频免费观看| 亚洲高清日韩精品第一区| 免费无码成人AV在线播放不卡|