Java面面观:JVM动态加载
一、概念
JVM在执行java程序时,并不是把程序所用到的class都一次性地加载到内存中,而是按需加载class(当使用到尚未被加载的class时,才会去加载它)。
二、典型应用
正因为JVM动态加载class的特性,我们才能够在java程序运行时根据条件来控制加载不同的实现类。例如Commons Logging 会优先使用Log4j,只有当Log4j不存在时,才使用JDK Logging。
//Commons Logging优先使用log4j
LogFactory factory = null;
if(isClassPresent("org.apache.logging.log4j.Logger")) {
factory = createLog4j();
} else {
factory = createJdkLog();
}
boolean isClassPresent(String className) {
try {
Class.forName(className);
return true;
} catch(Exception e) {
return false;
}
}
所以,这也是为什么只要我们把Log4j放到classpath中去,Commons Logging就会自动使用Log4j。