我搜索了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为何以及何时执行“静态”部分?如果它还执行“静态”,那么这两个之间的核心区别是什么?
非常感谢。
答案 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");