java动态类加载

java动态类加载,java,reflection,static,Java,Reflection,Static,加载类时,使用方法forName(),将执行类中的任何静态初始值设定项。 我能阻止吗 try { Class.forName("MYClass"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } MyClass class MyClass{ static String TEST="MYC

加载类时,使用方法
forName()
,将执行类中的任何静态
初始值设定项。
我能阻止吗

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();
}
我发现Class.forName()有一个重载版本,即

public静态类forName(字符串名,
布尔初始化,
类加载器(加载器)
抛出ClassNotFoundException

什么是
初始化
参数

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

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

e、 g


如果不想执行静态初始化,请尝试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
    }
}

不,只需删除
static
关键字!不。。你能解释一下为什么你需要它吗?静态初始值设定项在你真正访问其中一个之前是不会执行的。只有到那时,它才会创造它们。
public SomeClass getSomeClass() {
   if (sm == null) {
      return new SomeClass();
   }

   return sm;

}
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
    }
}