【发布时间】:2019-10-30 23:36:46
【问题描述】:
我在 Java 中遇到了 Spring NestedRuntimeException 和 AbstractApplicationContext 两个类中的即时加载,这两种情况都使用静态代码块解决了相同的类加载器问题,但是它们的使用方式令人困惑。
混淆是关于在静态代码块中调用ClassName.class.getName(),这如何解决类加载器问题。
static {
// Eagerly load the ContextClosedEvent class to avoid weird classloader issues
// on application shutdown in WebLogic 8.1. (Reported by Dustin Woods.)
ContextClosedEvent.class.getName();
}
如果我也这样做,我会得到类加载器并手动加载这个类
Thread.currentThread()
.getContextClassLoader().loadClass(ContextClosedEvent.class.getName());
我们将不胜感激任何专家的建议。
【问题讨论】:
-
"Eager" 只是意味着他们在真正需要之前加载类(通常 JVM 会在第一次使用时加载它)。他们在这里通过使用
static初始化程序来执行此操作,该初始化程序通过对其执行某些(无用的)操作来强制加载该类。它可能修复了类加载器问题,因为线程类加载器在第一次使用时懒惰地完成时可能会有所不同。但我同意你的看法,这是一个 hack。 -
我认为这个链接可以帮助你,获得一些知识https://stackoverflow.com/a/2991015/6622913
-
仅供参考,在您的通话中,您将尝试加载同一个类两次。
-
@Thilo,这是有道理的,对方法的调用将加载类,使用线程的类加载器会抛出检查异常,他们可能希望在静态代码块中避免。
标签: java