3089589

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Class.forName即完成了类加载步骤的静态块加载这一步,还没有完成成员初始化的工作。
例如JDBC中首先要写一句Class.forName("com.mysql.jdbc.Driver"); 该类源代码如下

 package com.mysql.jdbc
 
 public class Driver extends NonRegisteringDriver implements java.sql.Driver {
  // ~ Static fields/initializers
  // --------------------------------------------- //
  // Register ourselves with the DriverManager
  //    
  static {
     try {               java.sql.DriverManager.registerDriver(new Driver());
           } catch (SQLException E) {
               throw new RuntimeException("Can't register driver!");
           }
   }
 // ~ Constructors
  // -----------------------------------------------------------    
 /**//**
   * Construct a new driver and register it with DriverManager
   *
   * @throws SQLException
   *             if a database error occurs.
   */
  public Driver() throws SQLException {
      // Required for Class.forName().newInstance()    
  }
 }
 

即会执行该类的静态代码块,因为JDBC要首先注册驱动

但也可以在Class.forName时不让其执行静态代码块,让其在newInstance时跟成员初始化一起进行

public class Test {
     public String a = "abc";
     
     {
         System.out.println("456");
     }
     static{
         System.out.println("123");
     }
     public Test(){
         System.out.println("create");
     }
 }

然后在另一个类的main方法中执行

Class.forName("com.test5.Test",false,com.test5.Test.class.getClassLoader());

则什么也不会打印,如果不加参数

Class.forName("com.test5.Test");

则会打印出123,如果实例化该类,则会打印出

123
456
create 

posted on 2013-03-26 09:24  liangge0218  阅读(144)  评论(0)    收藏  举报