为什么Java类加载器执行“静态”内容,例如Class.forName

时间:2018-12-01 14:07:52

标签: java class static loader

我搜索了ClassLoader和Class.forName之间的区别,大多数答案都说Class.forName将操作类的“静态”部分,而ClassLoader则不会。因此,我对此进行了测试:

public static void main(String[] args) {
    try {
        ClassLoader l = ClassLoader.getSystemClassLoader();
        Class c2 = l.loadClass("C");
        Constructor ctor2 = c2.getConstructor();
        C obj2 = (C) ctor2.newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

它打印:

static
default ctor

好吧,这不是我的预期,为什么ClassLoader为何以及何时执行“静态”部分?如果它还执行“静态”,那么这两个之间的核心区别是什么?

非常感谢。

1 个答案:

答案 0 :(得分:2)

int checkString(char *string) { int pos,state; for(pos=state=0; string[pos]; pos++) { switch(string[pos]) { case 'G': case 'g': if (state++ == 0) continue; break; case 'O': case 'o': if (state++ == 1 || state == 3) continue; break; case 'D': case 'd': if (state == 3) return pos-state; // Got it! default:break; } state=0; } return -1; // Failed } will not导致在创建实例时执行静态初始化程序。

您可以删除以下代码,然后重试:

l.loadClass("C");