当前位置: 代码迷 >> J2SE >> Class.forName()和静态代码块的有关问题
  详细解决方案

Class.forName()和静态代码块的有关问题

热度:104   发布时间:2016-04-23 21:02:43.0
Class.forName()和静态代码块的问题
如一个类class A {
static {
   system.out.println("aaaaa");
}
}

另一个类中class B{
main(){//main方法,大家知道就行了
Class.forName(A);
}
}

就会打印出“aaaaa”,为什么呐?
------解决方案--------------------
因为楼主写的那句话会导致你那个类的初始化。
只有在首次主动使用的时候会导致类的初始化。
主动使用的几种情况:
1:创建类的实例,例如:new XX();
2:访问某个类或者接口的静态变量,或者对该静态变量赋值;
3:调用类的静态方法
4:反射,例如:Class.forName("XX");
5:初始化一个类的子类
6:Java虚拟机其董事会被标注为启动的类,例如:java XX
楼主说的情况,应该是满足上面所说的第四条了。
------解决方案--------------------
LZ,
你classA 这个类声明了这个静态块,当累初始化的时候,就会加载。
当classB,直接Class.forName("A");的时候,系统会加载发射生成A,所以直接初始化,打印出了aaaa

------解决方案--------------------
在B类中执行Class.forName(A);时候,jvm会用ClassLoader自动加载A这个类,直接初始化A类,建议看看关于jvm的类加载的知识,有助于对java深一步的理解。。。
------解决方案--------------------
引用:
就会打印出“aaaaa”,为什么呐?


类中的代码块,分成静态的和非静态的。静态代码块是属于类的,而非静态是属于实例化对象的。
使用Class.forName("A")是加载类,所以类的静态代码块会执行。
像楼主的代码,如果把代码块的static去掉,那么代码就不会执行了。
如果要执行非静态代码块,那么需要把加载的类实例化:Class.forName("A").newInstance()
如下面代码所示。

    public static void main(String[] args) throws Exception {
        Class c = Class.forName("com.jscai.test.A");  // 加载类,执行静态代码块
        c.newInstance();                              // 实例化对象,执行非静态代码块
    }
class A {
    {  // 非静态代码块
        System.out.println("instance"); 
    }
    static {   // 静态代码块
       System.out.println("static");
    }
}

------解决方案--------------------
静态代码块随着类的加载现而加载,只要有调用这个类,就会执行静态代码块中的内容
------解决方案--------------------
楼上说的都很好的,我也说一下吧,是这样子的:
反射LZ懂吧,Java中,当你编译成.class 字节码时,即Java的Class对象(JVM)是自动帮你生成的,其中这个过程中,它load Class对象,并将它初始化(如果有static block则执行),它是优先与main执行的。
------解决方案--------------------
引用:
引用:因为楼主写的那句话会导致你那个类的初始化。
只有在首次主动使用的时候会导致类的初始化。
主动使用的几种情况:
1:创建类的实例,例如:new XX();
2:访问某个类或者接口的静态变量,或者对该静态变量赋值;
3:调用类的静态方法
4:反射,例如:Class.forName("XX");
5:初始化一个类的……


静态代码块 在类被加载是就会去执行
  相关解决方案