<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 閱讀(353) 評論(0)  編輯  收藏 所屬分類: Java

    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導航

    統計

    常用鏈接

    留言簿(1)

    隨筆分類(42)

    隨筆檔案(43)

    文章分類

    相冊

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 激情综合亚洲色婷婷五月APP| 亚洲视频在线一区二区| 久久亚洲美女精品国产精品| 国产美女视频免费观看的网站| 亚洲不卡无码av中文字幕| 色视频在线观看免费| 又色又污又黄无遮挡的免费视| 亚洲av乱码一区二区三区按摩| 曰皮全部过程视频免费国产30分钟| 亚洲人成人网站18禁| 日本免费一区尤物| 美女隐私免费视频看| 亚洲无码日韩精品第一页| 成人免费无码H在线观看不卡| 国产日韩亚洲大尺度高清| 99re免费在线视频| 亚洲制服丝袜第一页| 日韩在线免费电影| 狠狠躁狠狠爱免费视频无码| 亚洲精品无码AV人在线播放| 久久国产免费观看精品3| 国产91在线|亚洲| 伊在人亚洲香蕉精品区麻豆| 99免费在线视频| 亚洲第一页在线播放| 最好免费观看韩国+日本| 一区二区三区免费在线视频| 亚洲av无码国产精品色午夜字幕| 亚洲视频在线免费播放| 美女一级毛片免费观看| 亚洲91av视频| 日韩毛片无码永久免费看| 中国videos性高清免费| 亚洲国产品综合人成综合网站| 国产精品成人无码免费| 免费h视频在线观看| 亚洲日韩亚洲另类激情文学| 久久久久亚洲精品天堂久久久久久| 95老司机免费福利| 特级aa**毛片免费观看| 亚洲电影在线播放|