精华内容
下载资源
问答
  • class.forName

    千次阅读 2017-07-23 09:02:23
    对于大部分人来说,第一次见到class.forName(String className)这句代码应该是在使用jdbc方式连接数据库的时候。但这句代码本质上是什么含义,做了什么工作呢?本文将回答此问题。 理解Class.forName方法需要一些...

    对于大部分人来说,第一次见到class.forName(String className)这句代码应该是在使用jdbc方式连接数据库的时候。但这句代码本质上是什么含义,做了什么工作呢?本文将回答此问题。

    理解Class.forName方法需要一些知识铺垫,也就是Class类的概念和类加载的概念,强烈建议参考下《类的生命周期》(http://www.yanwushu.com/post/54.html)。

    Class类概念

    Class类用来描述一个类的结构,比如描述一个类有哪些成员,有哪些方法等。有多种方法可以获取一个类对应的Class类实例,比如:

    [java] view plain copy
    1. //第一种方式获取描述Dog类结构的Class类实例  
    2. Class<Dog> clazz = Dog.class;  
    3. //第二种方式  
    4. Dog d = new Dog();  
    5. Class<Dog> clazz = d.getClass();  


    类加载概念


    当使用一个类的时候(比如new一个类的实例),jvm会检查此类是否被加载到内存,如果没有,则会执行加载操作,加载操作的内容是,读取类对应的class文件数据,解析此数据,构造一个此类对应的Class类的实例,此Class类的实例描述了类的结构,并且提供了调用此类成员的接口。此时jvm就可以使用该类了,比如实例化此类,或者调用此类的静态方法。

    Java也提供了手动加载类的接口,class.forName()方法就是其中之一。

    初始化参数指定的类,并且返回此类对应的Class实例。

    类初始化概念

    类被加载之后,jvm已经获得了一个描述类结构的Class实例。但是还需要进行类初始化操作之后才能正常使用此类,类初始化操作就是执行一遍类的静态语句,包括静态变量的声明还有静态代码块。

    Class.forName方法

    此方法含义是:加载参数指定的类,并且初始化它。

    在jdbc连接数据库中的应用

    到这里,不用解释,读者也会明白,在使用jdbc方式连接数据库时,为什么要执行Class.forName('驱动类名')方法了:将驱动类的class文件装载到内存中,并且形成一个描述此驱动类结构的Class类实例,并且初始化此驱动类,这样jvm就可以使用它了,这就是Class.forName()方法的含义。

    (参考《jdbc注册驱动的三种方式》http://blog.csdn.NET/yanwushu/article/details/7574708),

    资源

    1. http://www.iteye.com/topic/15039

    2. Class.forName和ClassLoader.loadClass的比较 http://blog.csdn.net/lu7kang/article/details/5576043

    转载自:http://blog.csdn.net/yanwushu/article/details/7574713


    展开全文
  • Class.forName() 和 ClassLoader.loadClass()的区别? Class.forName() 和 Class.forName().NewInstance()的区别? Class.forName("xx.xx")等同于Cla

    http://blog.csdn.net/shanliangliuxing/article/details/6730800


    Class.forName() 和 ClassLoader.loadClass()的区别?

    Class.forName() 和 Class.forName().NewInstance()的区别?

    Class.forName("xx.xx")等同于Class.forName("xx.xx",true,CALLClass.class.getClassLoader()),第二个参数(bool)表示装载类的时候是否初始化该类,即调用类的静态块的语句及初始化静态成员变量。

    ClassLoader loader = Thread.currentThread.getContextClassLoader(); //也可以用(ClassLoader.getSystemClassLoader())

    Class cls = loader.loadClass("xx.xx"); //这句话没有执行初始化,其实与Class.forName("xx.xx",false,loader)是一致的,只是loader.loadClass("xx.xx")执行的是更底层的操作。

    只有执行cls.NewInstance()才能够初始化类,得到该类的一个实例

     

     

    Class的装载分了三个阶段,loading,linking和initializing,分别定义在The Java Language Specification的12.2,12.3和12.4。
    Class.forName(className) 实际上是调用Class.forName(className, true, this.getClass().getClassLoader())。注意第二个参数,是指Class被loading后是不是必须被初始化。
    ClassLoader.loadClass(className)实际上调用的是ClassLoader.loadClass(name, false),第二个参数指出Class是否被link。

    区别就出来了。Class.forName(className)装载的class已经被初始化,而ClassLoader.loadClass(className)装载的class还没有被link。
    一般情况下,这两个方法效果一样,都能装载Class。但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了。
    例 如,在JDBC编程中,常看到这样的用法,Class.forName("com.MySQL.jdbc.Driver"),如果换成了 getClass().getClassLoader().loadClass("com.mysql.jdbc.Driver"),就不行。
    为什么呢?打开com.mysql.jdbc.Driver的源代码看看,
    //
    // Register ourselves with the DriverManager
    //
    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }
    原来,Driver在static块中会注册自己到java.sql.DriverManager。而static块就是在Class的初始化中被执行。所以这个地方就只能用Class.forName(className)。

     

     

     

     

    Thread.currentThread().getContextClassLoader().loadClass()和Class.forName()返回的Class对象会有啥区别没?还有以前比较老的初始化JDBC的代码里,那句
    Class.forName(驱动类全名)
    作用是什么啊

    作用是把驱动程序的类加载到JVM中. 方便驱动管理程序来实例化驱动对象.(请注意,仅加载类模块)

    java里面任何class都要装载在虚拟机上才能运行。Class.forName就是装载类用的(和new不一样,要分清楚)。 

    至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?使用方法Class.forName(),不过要再加一点。 
    A a = (A)Class.forName("pacage.A").newInstance(); 
    这和你 
    A a = new A(); 
    是一样的效果。 

    Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段,动态加载和创建Class对象。

     

    Class.forName(驱动类全名) 
      1、他是为了加载JDBC驱动架包的 ,为JDBC中实现其接口的, 他还可以加载别的驱动 .
      2、("sun.jdbc.odbc.JdbcOdbcDriver"),用import的话,程序是不会去加载这个class的。只有通过Class.forName

    编译器加载类要依靠classloader, 而classloader有3个级别,从高到低分别是BootClassLoader(名字可能不准确) , ExtClassLoader, AppClassLoader. 
    这3个加载器分别对应着编译器去寻找类文件的优先级别和不同的路径:BootClassLoader对应jre/classes路径,是编译器最优先寻找class的地方 
    ExtClassLoader对应jre/lib/ext路径,是编译器次优先寻找class的地方 
    AppClassLoader对应当前路径,所以也是编译器默认找class的地方 
    现在给你分析你的问题我想因为Thread.currentThread().getContextClassLoader().loadClass(className) 
    是线程中的类加载器,直接调用起来效率最高,假设在这三个类加载器都找不到你的类,直接用Class.forname()映射 


    展开全文
  • Class.forName()、Class.forName().newInstance() 、New 三者区别! 终于明白为什么加载数据库驱动只用Class.forName()了!!困扰了我2个小时!!希望我写的这个东西对各位有所帮助。    在Java开发特别...

    Class.forName()、Class.forName().newInstance() 、New 三者区别!

    终于明白为什么加载数据库驱动只用Class.forName()了!!困扰了我2个小时!!希望我写的这个东西对各位有所帮助。

       
       在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法。通过查询Java Documentation我们会发现使用Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。因此,单单使用Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象。 
       这里有必要提一下就是Class下的newInstance()和new有什么区别?,首先,newInstance( )是一个方法,而new是一个关键字,其次,Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用 new关键字生成对象没有这个限制。 
       好,到此为止,我们总结如下: 
       Class.forName("")返回的是类 
       Class.forName("").newInstance()返回的是object 
       有数据库开发经验朋友会发现,为什么在我们加载数据库驱动包的时候有的却没有调用newInstance( )方法呢?即有的jdbc连接数据库的写法里是Class.forName(xxx.xx.xx);而有一 些:Class.forName(xxx.xx.xx).newInstance(),为什么会有这两种写法呢?
       刚才提到,Class.forName("");的作用是要求JVM查找并加载指定的类,如果在类中有静态初始化器的话,JVM必然会执行该类的静态代码 段。而在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的 Driver类的代码都必须类似如下:
      public class MyJDBCDriver implements Driver {
       static {
         DriverManager.registerDriver(new MyJDBCDriver());
      }
      }
     既然在静态初始化器的中已经进行了注册,所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了。
    贴出Proxool 连接池的静态初始化方法:
    public class ProxoolDriver implements Driver {

        private static final Log LOG = LogFactory.getLog(ProxoolDriver.class);

        static {
            try {
                DriverManager.registerDriver(new ProxoolDriver());
            } catch (SQLException e) {
                System.out.println(e.toString());
            }
        }
    }

    展开全文
  • Class.forName()的作用

    万次阅读 多人点赞 2019-05-30 21:25:19
    装载一个类并且对其进行实例化的操作。 装载过程中使用到的类加载器是当前类... Class.forName(String className)使用装载当前类的类装载器来装载制定的类,因为class.forName(String name)方法内部调用了Class.fo...
    1. 装载一个类并且对其进行实例化的操作。
    2. 装载过程中使用到的类加载器是当前类。

    为了详细描述,Class.forName()方法,这里使用classLoader.loadClass()进行对比描述

           Class.forName(String className)使用装载当前类的类装载器来装载制定的类,因为class.forName(String name)方法内部调用了Class.forName(className,true,this.getClass().getClassLoader())方法

           classLoader.loadClass(StringclassName,boolean resolve);需要手动制定装载器的实例。

           Class.forName(className)装载的class已经被实例化,classLoader.loadClass().则只是将信息装载给JVM。在JDBC中                   Class.forName(“com.mysql.jdbc.Driver”),如果换成getClass().getClassLoader().loadClass(“com.mysql.jdbc.Driver”),就不可以,因为它只是想JVM装载了Driver的类信息,但是没有实例化,也就不能执行相应的操作,因为Driver是需要被初始化才能被使用的。

    展开全文
  • 终于明白为什么加载数据库驱动只用Class.forName()了!!困扰了我2个小时!!希望我写的这个东西对各位有所帮助。 在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法。通过查询Java ...
  • Class.forName():获得一个已加载过的class对象。(new可以没有加载也可以已经加载了) Class.forName().newInstance() :等同于new,但是new可以根据参数调用其他的构造函数,但是newInstance()只能调用无参的构造...
  • 在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法。通过查询Java Documentation我们会发现使用Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance...
  • Class.forName()、Class.forName().newInstance() 、New 三者区别! 终于明白为什么加载数据库驱动只用Class.forName()了!!困扰了我2个小时!!希望我写的这个东西对各位有所帮助。    在Java开发特别是...
  • 在java中Class.forName()和ClassLoader都可以对类进行加载。ClassLoader就是遵循双亲委派模型最终调用启动类加载器的类加载器,实现的功能是“通过一个类的全限定名来获取描述此类的二进制字节流”,获取到二进制流...
  • 在一次偶然的跟同行交流的过程中,突然被问及Class.forName()、Class.forName().newInstance() 、New的区别,一时懵了, 竟然在java开发中最常见的一些东西竟说不清道不明的感觉,很不是滋味,于是下来仔细search了...
  • 问:简单谈谈你对 Java 中 Class.forName()、Class.class、getClass() 三者的理解? Class.class 的形式会使 JVM 将使用类装载器将类装入内存(前提是类还没有装入内存),不做类的初始化工作,返回 Class 对象。 ...
  • Class.forName和ClassLoader.loadClass

    千次阅读 2019-04-27 16:13:13
    在上一节中讲到突破双亲委派模型的CurrentClassLoader和ContextClassLoader,接下来重点讲Class.forName和ClassLoader.loadClass ,众所周知它们都可以用来加载目标类,它们之间有一个小小的区别,那就是Class.for...
  • java Class.forName 内部类

    千次阅读 2019-10-29 16:59:06
    对于正常类的 Class.forName(package.ClassName) 对于内部类 Class.forName(package.外部类名$内部类名)
  • Java中Class.forName()用法详解

    万次阅读 多人点赞 2018-11-22 20:10:59
    Class.forName()主要功能 Class.forName(xxx.xx.xx)返回的是一个类, Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段。 下面,通过解答以下三个问题的来详细...
  • Class.forName()用法详解

    万次阅读 多人点赞 2012-03-29 09:39:30
    Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类, 也就是说JVM会执行该类的静态代码段 下面,通过解答以下三个问题的来详细讲解下Class.forName()的用法。 ...
  • java反射中,Class.forName和classloader的区别(代码说话)

    万次阅读 多人点赞 2016-08-20 17:14:47
    java中class.forName()和classLoader都可用来对类进行加载。 class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。 而classLoader只干一件事情,就是将.class文件加载...
  • Class.forName()的作用与使用总结

    万次阅读 多人点赞 2014-07-24 16:18:42
    Class.forName是一个静态方法,同样可以用来加载类。该方法有两种形式:Class.forName(String name, boolean initialize, ClassLoader loader)和 Class.forName(String className)。第一种形式的参数 name表示的是类...
  • 转自:... ClassLoader.loadClass和Class.forName的区别 ...为什么要把ClassLoader.loadClass(String name)和Class.forName(String name)进行比较呢,因为他们都能在运行时对任意一个类,都能够
  • Class.forName()和xxx.class

    2018-03-15 15:18:21
    Class.forName()是根据类名称加载类 比如有一个类名为com.abc.AAA 此处Class.forName(‘com.abc.AAA ’).newInstance()就会创建一个AAA对象.class一般用来获取类的通用属性 比如AAA.class.getDeclareMethod()是获取...
  • 其中,根据类的文件描述获取对应字节码的方法forName(String name)可谓是对于Class.forName(String name)和ClassLoader.loadClass(String name)功能进行了扩展增强, /** * Class.forName()的进化版,返...
  • 类加载机制之Class.forName()

    千次阅读 2017-09-15 11:58:43
    Class.forName()是Java程序运行时加载类的默认方法,如下图所示: Class.forName()方法解析 Class.forName(String className):使用调用Class.forName()方法的类的类加载器加载加载类,如下图所示: Class....
  • 关于Class.forName

    千次阅读 2018-10-12 11:34:32
    如果你使用了mysql数据库并且使用了原生的数据库操作,你肯定有一段这样的代码Class.forName("com.mysql.jdbc.Driver"); 这段代码的意义就是生成一个代表com.mysql.jdbc.Driver类的java.lang.Class对象到...
  • 1、Class.forName()和ClassLoader.loadClass的比较 1.1、 Class.forName(className) 其内部实际调用的方法是 Class.forName(className,true,classloader) 方法:Class.forName0(String className, boolean ...
  • class.forname的作用

    千次阅读 2019-06-13 17:32:29
    Class.forName的作用以及为什么要用它 2016年02月26日 21:32:17 韩正阳 阅读数 4934 ...
  • Class.forName()无论引入哪个类都会报错。。。 ![图片说明](https://img-ask.csdn.net/upload/201912/30/1577707093_329553.png) 多谢各位大佬。。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 139,048
精华内容 55,619
热门标签
关键字:

class.forname