java动态类加载

时间:2012-06-14 13:44:13

标签: java reflection static

使用方法forName()加载类时,将执行类中的任何静态initializers。 我可以阻止这个吗?

try {
        Class.forName("MYClass");
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

MyClass的

class MyClass{

static String TEST="MYCLASS";
static SomeClass sm=new SomeClass();
}

我在doc中发现有一个Class.forName()的重载版本,即

public static Class<?> forName(String name,
                           boolean initialize,
                           ClassLoader loader)
                    throws ClassNotFoundException

什么是initialize参数?

2 个答案:

答案 0 :(得分:0)

这就是Java创建对象的方式,所以没有。一种方法是在其他时间延迟加载实例。

这意味着您必须删除静态引用。

e.g。

public SomeClass getSomeClass() {
   if (sm == null) {
      return new SomeClass();
   }

   return sm;

}

答案 1 :(得分:0)

如果您不想执行静态初始化,请尝试使用class literal而不是Class.forName

class A1{
    static{
        System.out.println("static block from A1");
    }
}

class B1{
    public static void main(String[] args) throws ClassNotFoundException {
//      Class.forName("A1");//this will invoke static initialization
        Class c=A1.class;//this will not invoke static initialization
    }
}