诸位高人:
我正学习JDBC,我发现这样一个问题:通过class.forname装载驱动程序时,直接使用:
Class.forName("......");的形式,我的JSP也以正常运行,可在不少参考书中,都是以:
Class.forName("......").newInstance();的形式调用的
请问:两者有何区别?newInstance()究竟有何用?

解决方案 »

  1.   

    楼主直接查看forName()的java doc比我说要清楚,我无非也是把java doc再复述一次。
      

  2.   

    楼上:
         doc文档,我看了,但仍然不清楚,那里好像只提到newInstance是创建某类的新实例,因此我觉得仅看doc文档,仍不能解答我原帖中的问题.
      

  3.   

    newInstance()应用反射机制创建类的实例,察看反射API,说的挺清楚。不过我感觉这两种方式没区别
      

  4.   

    还是搞不明白:
    既然Class.forName("......");与Class.forName("......").newInstance();能有同样的运行结果,那有什么必要用后者?
      

  5.   

    这两个方法完全不一样,他们的运行结果更是完全不一样。
    forName()返回一个Class对象,newInstance()根据返回的Class对象创建一个该对象的实例。
    即使不看代码也能从他们各自的异常看出两个方法的行为的不用,forName()不调用构造函数,newInstance()会调用构造函数。
    至于别的差别,可以去看代码。
      

  6.   

    运行这个类可以很明显的看出两个方法产生的是不同的对象。public class test {
    static class ex{
    String str = "asdf";
    public String toString()
    {
    return str;
    }
    }
    public static void main(String[] args)
    {
    a();
    b();
    }
    private static void a()
    {
    try {
    Class<ex> c = (Class<ex>) Class.forName("test$ex");
    System.out.println(c);
    } catch (ClassNotFoundException e1) {
    e1.printStackTrace();
    }
    }

    private static void b()
    {
    try {
    ex d = (ex) Class.forName("test$ex").newInstance();
    System.out.println(d);
    } catch (InstantiationException e1) {
    e1.printStackTrace();
    } catch (IllegalAccessException e1) {
    e1.printStackTrace();
    } catch (ClassNotFoundException e1) {
    e1.printStackTrace();
    }
    }
    }