何时加载 Java 类?
我在互联网上搜索了几个小时,无法得出任何结论。
最近我决定将 BouncyCastle 用于 SSL,但我希望它默认关闭,以便 BouncyCastle jar 可能不在类路径中。
private void enableBouncyCastleForSSL() {
if (config.isBouncyCastleEnabled()) {
Security.insertProviderAt(new BouncyCastleProvider(), 1);
}
}
即使禁用了config,它也在寻找BouncyCastle,并且由于类装入器错误而失败。java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider
我尝试只移动一行Security.insertProviderAt(new BouncyCastleProvider(), 1);对于一种新的方法,它表现出同样的问题。
但是当我引入一个类并将BouncyCastle移动到其中时,当配置被禁用时,类装入器问题不会出现
private void setupSSLProvider() {
if (voldemortConfig.isBouncyCastleEnabled()) {
SetupSSLProvider.useBouncyCastle();
}
}
public class SetupSSLProvider {
public static void useBouncyCastle() {
Security.insertProviderAt(new BouncyCastleProvider(), 1);
}
}
一些文章声称类仅在首次使用时才加载。http://www.programcreek.com/2013/01/when-and-how-a-java-class-is-loaded-and-initialized/
显然,在我的情况下,Java8加载了类中引用的类。
所以我的理解是,Java在执行类中的第一行代码之前,会加载一个层次的类。是吗?