Java Logger使用非常特定的ResourceBundle加载行为。为什么?
Java Logger使用非常特定的ResourceBundle加载行为。为什么?,java,classloader,java.util.logging,Java,Classloader,Java.util.logging,java.util.logging.Logger类以非常特定的方式定位ResourceBundle实例。我对理解类加载行为感兴趣 放弃缓存等,首先Logger类尝试使用(这很好,也是我所期望的) 如果该类加载器无法加载ResourceBundle(使用),那么接下来将使用系统类加载器。这让我有点困惑;我假设调用方的类加载器将是下一个。这是一个优化,还是处理一些特定的用例,或者 最后,如果系统类加载器无法加载ResourceBundle,则遍历推断的调用堆栈(!),并为其类加载器挖掘该堆栈中的每个
java.util.logging.Logger
类以非常特定的方式定位ResourceBundle
实例。我对理解类加载行为感兴趣
放弃缓存等,首先Logger
类尝试使用(这很好,也是我所期望的)
如果该类加载器无法加载ResourceBundle
(使用),那么接下来将使用系统类加载器。这让我有点困惑;我假设调用方的类加载器将是下一个。这是一个优化,还是处理一些特定的用例,或者
最后,如果系统类加载器无法加载ResourceBundle
,则遍历推断的调用堆栈(!),并为其类加载器挖掘该堆栈中的每个类,然后依次尝试这些类
对于我遇到的或必须编写的各种类加载场景,这一个对我来说意义不大。我怀疑这与Logger
对任何给定系统的潜在中心性有关,但我欢迎任何关于为什么选择此特定算法的解释
(还有一个附带的问题,不值得自己去问:JVM中是否存在这样的情况,即
null
?)我猜他们的想法是支持层次结构及其在每个应用服务器中的不同实现
此外,如果我们检查,我们有
作为初始实现中的临时转换功能,如果记录器无法从ContextClassLoader或SystemClassLoader中找到ResourceBundle,记录器还将搜索类堆栈,并使用连续调用的ClassLoader尝试定位ResourceBundle。(此调用堆栈搜索允许容器转换为使用ContextClassLoader,并且可能在将来的版本中被删除。)
如果不是通过推断的调用堆栈(
newexception()
),如何到达调用方的CL?至于你的问题,根据Javadoc的说法,Thread.setContextClassloader(null)
是一个合法的调用。调用堆栈不是通过StackTraceeElement
来推断的,而是通过内部Sun类来推断的。这意味着其他任何人都不能(应该)在不具备便携性的情况下使用该算法。谢谢关于上下文类加载器的问题。哦!错过了;谢谢这是有道理的;你得到答案了。