当前位置:  编程技术>java/j2ee

java中Class.forName的作用浅谈

    来源: 互联网  发布时间:2014-10-28

    本文导语:  Class.forName(xxx.xx.xx) 返回的是一个类 一.首先你要明白在java里面任何class都要装载在虚拟机上才能运行。 1. forName这句话就是装载类用的(new是根据加载到内存中的类创建一个实例,要分清楚)。   至于什么时候用,可以考虑一下...

Class.forName(xxx.xx.xx) 返回的是一个类

一.首先你要明白在java里面任何class都要装载在虚拟机上才能运行。

1. forName这句话就是装载类用的(new是根据加载到内存中的类创建一个实例,要分清楚)。
  至于什么时候用,可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?

    A a = (A)Class.forName("pacage.A").newInstance();        这和           A a = new A();        是一样的效果。

2.jvm在装载类时会执行类的静态代码段,要记住静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了,而且以后不会再执行这段静态代码了。

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

3.动态加载和创建Class 对象,比如想根据用户输入的字符串来创建对象

代码如下:

String str = 用户输入的字符串  

Class t = Class.forName(str);  

t.newInstance(); 


二.在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?

1.它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。

2.那么为什么会有两种创建对象方式?

 这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。 
Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。 例如:

代码如下:

    class c = Class.forName(“Example”);  

    factory = (ExampleInterface)c.newInstance();  


其中ExampleInterface是Example的接口,可以写成如下形式:
代码如下:

   String className = "Example";  

   class c = Class.forName(className);  

   factory = (ExampleInterface)c.newInstance();  


进一步可以写成如下形式:
代码如下:

   String className = readfromXMlConfig;//从xml 配置文件中获得字符串

  class c = Class.forName(className);  

  factory = (ExampleInterface)c.newInstance();  


 上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。 
3.从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。  但是使用newInstance()方法的时候,

  就必须保证:

       1、这个类已经加载;

       2、这个类已经连接了。

 而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载 java API的那个加载器。 
 现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好

  的灵活性,提供给了一种降耦的手段。 
三.最后用最简单的描述来区分new关键字和newInstance()方法的区别: 
  1. newInstance: 弱类型。低效率。只能调用无参构造。 
  2. new: 强类型。相对高效。能调用任何public构造。

     有数据库开发经验朋友会发现,为什么在我们加载数据库驱动包的时候有的却没有调用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);就可以了。

    
 
 

您可能感兴趣的文章:

  • java的网络功能类socket是作用于哪一层的,偶要写一个更底层的网络通讯程序,用到了APDU协议,用java能实现吗?偶其他的语言不熟!!!!
  • 请问java中匿名函数的作用
  • 请教:整合apache/tomcat时设置JAVA_HOME/TOMCAT_HOME环境变量起什么作用?没有用到啊?
  • Java中关于作用域的一个问题,欢迎大家的光临。
  • 请教,关于JAVA中变量的作用域的问题!
  • java.lang.Class包有什么作用?
  • java的"句柄"进入函数时不是有副作用吗?可是String怎么就不呢?
  • 请问Adapter类在整个Java API中的位置是?以及它的作用和使用方法?
  • 浅析JAVA_HOME,CLASSPATH和PATH的作用
  • 深入解析Java中volatile关键字的作用
  • 基于Java的打包jar、war、ear包的作用与区别详解
  • 基于java内部类作用的深入分析
  • (初学者)请问 java中为何用到package(包),有什么作用?
  • 浅析JAVA中toString方法的作用
  • java命名空间java.nio.charset类charset的类成员方法: forname定义及介绍
  • java命名空间java.lang类character.unicodeblock的类成员方法: forname定义及介绍
  • java命名空间java.lang类class<t>的类成员方法: forname定义及介绍
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.tools枚举javafileobject.kind的类成员方法: class定义及介绍
  • 有两个:1.class与2.java,2.java继承1.class类,要把2.java编译成2.class给如何书写!
  • java命名空间java.io接口objectstreamconstants的类成员方法: tc_class定义及介绍
  • xx.java继承yy.class,编译xx.java为xx.class时应怎样书写?(谢谢)
  • java命名空间java.lang.annotation枚举retentionpolicy的类成员方法: class定义及介绍
  • java bean和java class的区别??
  • java命名空间java.lang类class<t>的类成员方法: getsuperclass定义及介绍
  • JAVA编译的CLASS文件可以反编译为JAVA文件吗?
  • java命名空间javax.swing.text.html类html.attribute的类成员方法: class定义及介绍
  • java线程怎么调用java的application.class?
  • java命名空间javax.tools枚举standardlocation的类成员方法: class_path定义及介绍
  • 谁有办法用java执行于java.exe不在一个目录的class文件?
  • java命名空间javax.lang.model.element枚举elementkind的类成员方法: class定义及介绍
  • 用什么工具可以把JAVA的.CLASS文件反编译成.JAVA文件??
  • java命名空间javax.tools枚举standardlocation的类成员方法: class_output定义及介绍
  • 在java中,什么情况下属于不同的进程,是在不同的classload中加载的class,还是在不同的jvm中加载的class
  • java命名空间java.util类resourcebundle.control的类成员方法: format_class定义及介绍
  • 请问java bean 与普通的java class的主要区别?
  • java命名空间java.lang类class<t>的类成员方法: getenumconstants定义及介绍
  • 我已经编译了一个hello.class的文件,为什么,使用java hello还是提示没有hello.class这个类呢?
  • java命名空间java.lang类class<t>的类成员方法: getdeclaringclass定义及介绍
  • java中public class与class的区别详解
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3