首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

有关Class对象中Class.forName("package.classname")的疑惑?解决方案

2012-01-12 
有关Class对象中Class.forName(package.classname)的疑惑?首先大家都知道产生Class对象的同时会对该Clas

有关Class对象中Class.forName("package.classname")的疑惑?
首先大家都知道产生Class对象的同时会对该Class对象进行初始化(若以前没有初始化过)
我想问的是这个“初始化”与普通的初始化(通过new 对象)是否一样?
下面的例子通过Class.forName("package.classname")初始化后发现它只初始化了静态域,而未初始化构造函数!这是为什么?

Java code
package exc;class came1 {        static{         System.out.println("staticaa");    }    public came1(){         System.out.println("came1");    }}class came2 extends came1{     static{         System.out.println("staticbb");    }     public came2(){         System.out.println("came2");    }}public class clo {  public static void main(String [] args) throws ClassNotFoundException{           Class c=null;       c=Class.forName("exc.came2");                          Class cy=c.getSuperclass();        System.out.println("cname="+cy.getName()+"is interface:"+cy.isInterface());  }      }

运行结果:
staticaa
staticbb
cname=exc.came1is interface:false

[解决办法]
这个例子根Class对象的初始化有什么关系吗
[解决办法]
  因为你未实例,只是加载类!
came2 c=Class.forName("exc.came2").newInstance();
等价于came2 c=new came2();
等价于came2 c=came2.class.getConstructor(null).newInstance();

[解决办法]
静态域 静态块 是不依赖于 对象存在的.

当整个类被 第一次加载时.. 会执行静态域(Field)初始化语句和静态块.
  
而当构造类的实例(Instance)时.. 才会调用类的 相应构造方法.

这就是你得到结果的原因.

热点排行