`

Class.forName详解

    博客分类:
  • 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也就是factory就可以。
   从JVM的角度看,使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。
而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载 java API的那个加载器。
   现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。
   分步的好处是显而易见的:可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。
   最后用最简单的描述来区分new关键字和newInstance()方法的区别:
   newInstance: 弱类型。低效率。只能调用无参构造。
   new: 强类型。相对高效。能调用任何public构造。

forName() 和 ClassLoader 的 loadClass 方法。
    为什么 forName()是会执行static语句?
    因为默认情况它总是初始化这个被装载的类。
   
    关于forName()方法
    这个方法总是返回要加载的类的Class类的实例
1、forName(String className)单参数时, initialize=true
    a.总是使用当前类装载器(也就是装载执行forName()请求的类的类装载器)
    b.总是初始化这个被装载的类(当然也包括:装载、连接、初始化)
2、forName(String className, boolean initialize, ClassLoader loader)
    a.loader指定装载参数类所用的类装载器,如果null则用bootstrp装载器。
    b.initialize=true时,肯定连接,而且初始化了;
    c.false时,绝对不会初始化,但是可能被连接了,有个例外,如果在调用这个forName()前,已经被初始化了,那么返回的类型也肯定是被初始化的(当然,暗含着:
      被同一个loader所装载的,而且该类被初始化了)
    关于用户自定义的类装载器的loadClass()方法
1、loadClass(String name)单参数时, resolve=false
    a.如果该类已经被该类装载器所装载,那么,返回这个已经被装载的类型的Class的实例,否则,就用这个自定义的类装载器来装载这个class,这时不知道是否被连接。绝对不会被初始化
    b.这时唯一可以保证的是,这个类被装载了。但是不知道这个类是不是被连接和初始化了
2、loadClass(String name, boolean resolve)
    a.resolve=true时,则保证已经装载,而且已经连接了。
       resolve=falses时,则仅仅是去装载这个类,不关心是否连接了,所以此时可能被连接了,也可能没有被连接
from:http://blog.sina.com.cn/s/blog_60f823dd0100ozuz.html
分享到:
评论

相关推荐

    java中Class.forName方法的作用详解

    Class.forName(xxx.xx.xx) 返回的是一个类,但Class.forName方法的作用到底是什么終?下面这篇文章就来给大家详细介绍了关于java中Class.forName方法的作用,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来...

    java反射详解

    demo=Class.forName("Reflect.Person"); }catch (Exception e) { e.printStackTrace(); } Person per=null; try { per=(Person)demo.newInstance(); } catch (InstantiationException e) { // TODO Auto-...

    JDBC详解HTML-JDBC.pp

    <2>.Class.forName(driver).newInstance() <3>.new driver() 2>.取得数据库连接(Connect to the DataBase) <1>.用DriverManager取数据库连接 Connection cn = DriverManager.getConnection(url,uid,pwd); <2>....

    Java开发中连接数据库的方法和详解

     在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String className)实现。  例如:  try{  //加载MySql的驱动类  Class.forName(...

    JDBC 连接MySQL实例详解

    Class.forName(“com.mysql.jdbc.Driver”); Class.forName(“com.mysql.jdbc.Driver”).newInstance(); JDBC URL 定义驱动程序与数据源之间的连接 标准语法: <protocol>:<subprotocol>: MySQL的JDBC URL格式:...

    JAVA核心知识点整理(有效)

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................

    vue列表单项展开收缩功能之this.$refs的详解

    展开效果–看红框区域 ...<li class=main-videov-for key=item.id> <div class=audio-name> <div class=img-l> <span class=img-l-num>{{index+1}} <span class=img-l-name>{{item.subName}}</span>

    J2EE应用开发详解

    29 3.2.2 Class.forName()加载类的实例 30 3.2.3 loadClass获得类的实例 31 3.3 操作类的字段 31 3.3.1 获取对象的属性 31 3.4 操作类的方法 34 3.4.1 运行时调用对象的方法 34 3.4.2 无参构造函数 36 3.4.3 带参...

    多线程详解

    this.name = name; } public void run() { for (int i = 0; i ; i++) { for (long k = 0; k ; k++) ; System.out.println(name + ": " + i); } } } /** * 测试Runnable类实现的多线程程序 * *...

    第七篇Bootstrap表单布局实例代码详解(三种表单布局)

    Bootstrap提供了三种表单布局:垂直表单,内联表单和水平表单。下面逐一给大家介绍,有兴趣的朋友一起学习吧。 创建垂直或基本表单: •·向父 <form> 元素添加 role=”form”...<label for=name>名称 <inpu

    VBSCRIP5 -ASP用法详解

    MonthName 函数 返回表示月份的字符串。 MsgBox 常数 与MsgBox 函数一起使用的常数列表。 MsgBox 函数 在对话框中显示消息,等待用户单击按钮,并返回表示用户所击按钮的数值。 乘法运算符 (*) 两数相乘。 取反...

    详解python的ORM中Pony用法

    Pony是Python的一种ORM,它允许使用生成器表达式来构造...SELECT p.id, p.name, p.age, p.classtype, p.mentor, p.gpa, p.degree FROM person p WHERE p.classtype IN ('Student', 'Professor', 'Person') AND p.age >

    vue中 this.$set的用法详解

    当vue的data里边声明或者... <p v-for=item key=item.id>{{item.message}} <button class=btn @click=handClick()>更改数据</button> [removed] export default { name: 'App', data () { return {

    spring chm文档

    Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright...

    Vue.js实现拖放效果的实例

    <div class='select-item' draggable='true' dragstart='drag($event)' v-for='pjdt in projectdatas'>{{pjdt.name}} <div class='people-content'> <div class='drag-div' v-for='(ppindex,ppdt) in p

    jquery.form.js异步提交表单详解

    本文实例为大家分享了jquery.form.js异步提交表单的具体代码,供大家参考,具体内容如下 引入脚本: [removed][removed] [removed][removed] ...input class=input-text upload-url radius type=text name=uploadfi

    微信小程序radio组件使用详解

    本文为大家分享了微信小程序radio组件的使用方法,供大家参考,具体内容如下 ... <view class=tui-menu-list><radio color=#007aff value={{item.name}} checked={{item.checked}}/>{{item.value}}</

    jpivot学习总结.doc

    providerClass 否 String 是 如果存在该属性,这个类的实例将会从当前的 member 中获取 SessionParam 对象的实例,这里的类必须实现 com.tonbeller.jpivot.table.navi.ClickableMember.ParameterProvider 接口。...

    微信小程序checkbox组件使用详解

    本文为大家分享了微信小程序checkbox组件的使用方法... <label class=checkbox wx:for={{items}}> <view class=tui-menu-list><checkbox value={{item.name}} checked={{item.checked}}/>{{item.value}} </chec

Global site tag (gtag.js) - Google Analytics