谁能告诉我一下Class.forName("")方法的用处
有人说是用来载入类的,那么与import 导入有什么区别?

解决方案 »

  1.   

    Class.forName():类是程序的一部分,每个类都有一个Class对象,即每当编写并且编译了一个新类,就会产生一个Class对象,在运行时,当我们想生成这个类的对象时,运行这个程序的jvm会首先检查这个类的Class对象是否已经加载,如未加载,jvm就会根据类名查找.class文件,并将其载入.而Class.forName("A")不仅产生class对象而且有个副作用:如果类A没有被加载,就加载它.一句话:动态加载!import:静态加载!
      

  2.   

    感谢gesanri,我去试试将我的静态加载改成动态的
      

  3.   

    从软件设计的角度讲Class.forName()可以让你动态创建类。你可以
    String myClassName = readFromFile ();
    MyInteface clazz = Class.forName(myClassName).newInstance ();
    这样你可以动态从一个文件创建一个类的实例而不用硬编码在代码里,这样就提供了灵活性。如果你用new关键字的话,只能
    MyInteface instance = new MyClass ();你就必须事先知道类的名字。
    从JVM的角度讲,使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证这个类已经加载并已经连接。
    至于import完全是不同的概念,只是类似于一个声明一样,不会使jvm加载类。
      

  4.   

    返回一个你指定的参数的Class对像。
      

  5.   

    MyInteface clazz = Class.forName(myClassName).newInstance (); 我用此做了一下做不出来
    能给我举个小例子吗?
    1.做了个接口jk
    2.做了个类bb(在aa包中)实现了接口
    3.做了个main方法的类中导入了接口,其中写下了
    jk clazz=Class.forName("aa.bb").newInstance (); 
    编译有问题,
    改成
    jk clazz=Class.forName("aa.bb");
    编译有问题
    我理解错了????????? 
      

  6.   

    答:两者概念上完全不同
    1)Class.forName(...)是运行期,程序运行时装入类并做类的初始化.
    2)import仅仅是JAVA编译器在编译程序,并生成目标代码时,将import的类或包中的所有的东西放入"符号表"中,以便编译类时查找到类中的信息.在编译完成后,import的使命也就结束了.与程序运行没有关系的.
      

  7.   

    就像下面这么用:/**
     * 
     * MyInterface.java
     *
     */
    public interface MyInterface
    {
    void print ();
    }/**
     * 
     * MyClass.java
     *
     */
    public class MyClass implements MyInterface
    { public void print ()
    {
    System.out.println ("MyClass");
    } public static void main (String[] args)
    {
    try
    {
    //Use Class.forName
    MyInterface clazz = (MyInterface) Class.forName ("MyClass").newInstance ();
    clazz.print ();
    //Use new
    MyInterface clazz1 = new MyClass ();
    clazz1.print ();
    }
    catch (InstantiationException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    catch (IllegalAccessException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    catch (ClassNotFoundException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } }}
      

  8.   


    import:静态加载不同意,据我了解import只是告诉编译器本文件用到的外部的类去哪个包地下找,只是"告诉"一下,而不会真正的"加载"这个类,当编译器遇到一个不认识的类的时候,会从所有的 import后边的包中寻找这个类,然后加载.类是在用到的时候才会加载,这叫动态加载.
      

  9.   

    感谢ring0hx
    下面这句
    MyInterface clazz = (MyInterface) Class.forName ("MyClass").newInstance (); 
    我是如下写的
    MyInterface clazz =  Class.forName ("MyClass").newInstance ();
    加了(MyInterface)后好用了,谢谢所有帮助我的老师
    谢谢啦!!! 
      

  10.   

    如果单独一个语句
     Class.forName ("类路径");
    这个语句有什么作用呢?
    (在连接数据库驱动程序时是这样用的)
      

  11.   

    单独一句Class.forName ("类名")在数据库驱动时是很常用的,就是让jvm加载驱动类用的。
    因为JDBC的DriverManager是个通用的类,显然不可能事先通过硬编码来创建驱动程序的实例,因为它根本不知道用户将使用哪个驱动程序。所以不可能有类似 new com.microsoft.jdbc.sqlserver.SQLServerDriver()这样的代码出现。所以就需要使用DriverManager.getConnection之前调用Class.forName("驱动名")来使JVM加载驱动程序类。
      

  12.   

    谁能告诉我一下Class.forName("")方法的用处 
    运行时候把类信息加载进来,会产生一个Class 对象,放到 heap的perm区.
    有人说是载入类的,那么与import 导入有什么区别?
    improt告诉编译器,这个类里用到的某个类是那个具体的类(package信息),告诉编译器到
    哪儿去获得你调用的那个类的方法的信息,这些信息会被编译到你的类里面去.
      

  13.   

    JVM加载驱动程序类指的是在运行时将驱动程序类SQLServerDriver调入内存吗?
      

  14.   

    回kkdelta
    这么说 如果单独一个语句 
    Class.forName ("类名");
    将产生一个类对象,只是固定的将这个类对象放在了 heap的perm区,
    如果要使用这个类对象只要去heap的perm区去取?
     heap的perm区是什么,怎么用呢?
    是不是很复杂呀?!
      

  15.   

    kkdelta说: 
    如果单独一个语句 
    Class.forName ("类名"); 
    将产生一个类对象,将这个类对象放在了 heap的perm区, 
    我知道了heap是内存的自由使用区,动态产生的变量都在此申请到了内存,对吗?
    问题是程序中怎么能用到这个动态产生的对象呢?
    如果语句是这样的
    MyInterface clazz = (MyInterface) Class.forName ("MyClass").newInstance (); 
    拿着clazz能使用这个对象
    是这样的一个单独的语句Class.forName ("类名"); 这个类对象产生了怎么用??????
      

  16.   

    这就是jre的实现的问题了。我猜jre是根据接口查询来实现实例化。因为每个jdbc driver都必须实现SPI接口java.sql.Driver,那么DriverManager可以在自己的classLoader中查询实现了java.sql.Driver的类,然后再实例化。所以在使用前需要先调用Class.forName来载入驱动类,这样DriverManager才可以找到对应的driver。
    顺便说一下,在jdbc4.0中应该已经不需要通过Class.forName来加载driver了,它加入了自动发现机制。你可以参考一下jdk6.0的javadoc。
      

  17.   

    import 是声明,指定了类加载得路径,如果虽然import了某个类,但是这个类没有被使用,虚拟机也不会去加载。
    而Class.forname,是自己强制得去加载,不管这么类使用不使用
      

  18.   

    谢谢ring0hx
    看来我要学的东西还很多,
      

  19.   

    在数据库连接类中,单独的一句:class.forName(类路径);是为了加载数据库驱动包或者类。
      

  20.   

    引用 12 楼 jiangnaisong 的回复:
    引用楼主 dbky50 的帖子: 
    谁能告诉我一下Class.forName("")方法的用处 
    有人说是用来载入类的,那么与import 导入有什么区别? 答:两者概念上完全不同 
    1)Class.forName(...)是运行期,程序运行时装入类并做类的初始化. 
    2)import仅仅是JAVA编译器在编译程序,并生成目标代码时,将import的类或包中的所有的东西放入"符号表"中,以便编译类时查找到类中的信息.在编译完成后,import的使命也就结束了.与程序运行没有关系的. 
      

  21.   

    当使用MyInteface clazz = Class.forName(myClassName).newInstance (); 这一句的时候newInstance ()方法相当于调用了你动态加载的类的构造方法,但是我可以明确的告诉你如果构造方法是有参数的时候,你的这种创建类的实例是行不通的,只能通过反射API方法来实现了!
      

  22.   

                    try{
    //加载驱动
    Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
    //获取连接
    conn=DriverManager.getConnection("jdbc:db2:books");
    }catch(ClassNotFoundException e){
    e.printStackTrace();
    }catch(SQLException e){
    e.printStackTrace();
    }
    加载数据库的驱动用的,每个数据库都有一个jar的包,就是调用里面的class文件
    这个是连接db2数据据的语句!
      

  23.   

    补充 
    import 是用来导入其他包中的类文件用的
    如果不导入
    在当前包下是找不到的!