`

实例化 与 类装载的区别

 
阅读更多
java下Class.forName的作用是什么,为什么要使用它 
Class.forName(xxx.xx.xx) 返回的是一个类
 
首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。   

至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。  
A a = (A)Class.forName("pacage.A").newInstance();  这和你  
A a = new A();  是一样的效果。   
关于补充的问题  答案是肯定的,jvm会执行静态代码段,你要记住一个概念,静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了。而且以后不会再走这段静态代码了。 
Class.forName(xxx.xx.xx) 返回的是一个类  
Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段 

动态加载和创建Class 对象,比如想根据用户输入的字符串来创建对象 
 String str = 用户输入的字符串 
Class t = Class.forName(str);  
t.newInstance(); 
 在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。
   
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就可以。   

从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,
就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载java API的那个加载器。   

现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。   
最后用最简单的描述来区分new关键字和newInstance()方法的区别:  newInstance: 弱类型。低效率。只能调用无参构造。  new: 强类型。相对高效。能调用任何public构造。



引用:
http://wenku.baidu.com/link?url=NI7VLiYn8o46r8OGGfzFa-HdW_oDVg7ARzPpj9FvELL_ZTcXu0tXkgp_kPpRn_nrBfXW3s6X_f7VjUkjKspTsbE2oqNs50qKy8O6ZaR3HEC
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    论文研究-铁路超限超重货物装载加固可拓实例推理方法.pdf

    结合铁路超限超重货物特征及其装载加固决策要素,采用可拓基元与实例推理技术,构造超限超重货物装载加固实例推理基础数据与推理规则模块的可拓基元模型,分析装载加固可拓实例属性取值特征,给出局部与全局相似度...

    JAVA笔记.zip

    实例化前初始化 类装载时分配空间 多个对象共享同一内存空间 不能被垃圾收集线程收集 静态代码块 装载时运行 在main 之前 只运行一次 下次类再装载或创建对象时不运行 静态方法 类名调用(推荐) 实际也...

    nc二开单据

    nc的单据开发,单表体的单据:指装载界面数据的聚合VO表头为空,只存在一组表体VO。UI工厂设计了接口ISingleController,单表体单据界面控制类应实现此接口,并实现isSingleDetail方法。 前期准备:单据注册,模板...

    Java中类与对象的生命周期

    然后在堆区实例化一个java.lang.Class对象,作为方法区中的类的信息入口。  不同的jvm对于类的装载时机并不相同,有些在遇到这个类时装载这个类(虽然并不知道这个类是否会被用到),另一些则在真正用到一个类的...

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    controller-loader:递归地加载和实例化给定目录中的所有控制器

    控制器装载机 递归地加载和实例化给定目录中的所有控制器。 在找到的相同版本的修改版本。

    岩巷掘进机械化作业线实例分析

    介绍了5种岩巷掘进机械化作业线应用概况;分析了以全液压掘进钻车和侧卸式防爆装载机为主配套的和手持式凿岩机打眼,耙矸机装岩,防爆胶轮车排矸的2种机械化作业线应用实例。

    vc++ 开发实例源码包

    内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例源码) 多个VC++加密解密算法库(CRYPT++) 详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    你必须知道的C#的25个基础概念(附源码)

    答:静态变量:静态变量使用 static 修饰符进行声明在所属类被装载时创建通过类进行访问所属类的所有实例的同一静态变量都是同一个值非静态变量:不带有 static 修饰符声明的变量称做非静态变量在类被实例化时创建...

    设计模式之原型模式和桥接模式摘录

    以及当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者为了避免创建一个与产品类层次平行的工厂类层次时;或者当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次...

    java 异常总结

    当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。 java.lang.NoSuchFieldError 域不存在错误。当应用试图访问或者修改某类的某个域,而该类的定义中没有该域的定义时抛出该错误。 java....

    解析设计模式中的Prototype原型模式及在C++中的使用

    当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者 为了避免创建一个与产品类层次平行的工厂类层次时;或者 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用...

    张孝祥Java培训教程

    这本书,是一本比较基础的入门书籍。书中并没有涉及到太深入太负责的知识和应用。 1,只要定义有参数的构造方法...5,类的static属性在类被装载时被初始化。 6,Java参数是值传递,且函数的形参是实参的副本。 ......

    Java开发技术大全(500个源代码).

    differ.java 测试静态方法与实例方法之间的区别 forefather.java 一个简单的基类 grandson.java 上面这个类的子类 hasConstructor.java 拥有构造器的类 hasFinalFun.java 拥有最终方法的类 hasRecall.java ...

    单例模式,single

    在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时如何处理这些缺陷。 单例模式适合于一个类只有一个实例的情况,比如窗口管理器...

    java 面试题 总结

    而通常的内部类需要在外部类实例化后才能实例化。 22、JSP中动态INCLUDE与静态INCLUDE的区别? 动态INCLUDE用jsp:include动作实现 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态...

Global site tag (gtag.js) - Google Analytics