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

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

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

    Aaron Johnson對Class.forName()的解釋!

    Posted on 2006-03-02 20:57 killvin 閱讀(341) 評論(0)  編輯  收藏 所屬分類: java

    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.

    主站蜘蛛池模板: 在线视频免费观看爽爽爽| 九九九精品成人免费视频| 免费看小12萝裸体视频国产| 性色av免费观看| 久久久久se色偷偷亚洲精品av| 最近中文字幕免费2019| 亚洲第一页中文字幕| 5g影院5g天天爽永久免费影院 | 免费a级毛片大学生免费观看| 亚洲精品无码不卡在线播放| 在线看片人成视频免费无遮挡| 亚洲精品中文字幕无码A片老| 日韩一级免费视频| 老司机午夜在线视频免费观| 色猫咪免费人成网站在线观看| 亚洲成人激情在线| 妻子5免费完整高清电视| 亚洲天堂男人影院| 国产三级免费观看| a级毛片免费完整视频| 亚洲成人午夜在线| 人妻视频一区二区三区免费| 亚洲日韩国产AV无码无码精品| 国产成人免费永久播放视频平台 | 亚洲精品无码你懂的| 亚洲av日韩片在线观看| 国产精品高清免费网站| 亚洲国产日韩一区高清在线| 中文字幕乱码免费视频| 国产一区二区三区亚洲综合 | 永久亚洲成a人片777777| 国产成人精品一区二区三区免费 | 亚洲AV无码男人的天堂| 中文字幕亚洲一区二区va在线| 一级毛片免费播放| 亚洲精品人成网线在线播放va | baoyu777永久免费视频| 亚洲人成电影在线观看青青| 91福利免费网站在线观看| 亚洲精品国产免费| 亚洲国产日韩成人综合天堂|