我注意到我们可以随意设置线程的上下文类加载器。这是否意味着new上下文类加载器的 loadClass 被调用的每个结果?
2 回答
收到一只叮咚
TA贡献1821条经验 获得超4个赞
不,loadClass()
只会在第一次访问类时调用一次。(这不一定会发生在 上new()
,如果您尝试访问static
类的成员,则可能会发生这种情况。)
在该类的每次后续访问中,loadClass()
都不会被调用。
这是因为每次需要该类时,ClassLoader 都会在findClass()
内部调用,它会尝试查找已加载的类,因此如果该类已加载,则 ClassLoader 会避免loadClass()
再次调用。
缥缈止盈
TA贡献2041条经验 获得超4个赞
类加载器的类加载可以实现为在另一个类引用它时立即加载一个类或延迟加载该类直到需要类初始化,但您应该注意,在某些情况下,行为可能与新的不完全相同,并且其他人可能也一样。如果 Class 在实际使用之前被加载,它可以在初始化之前放在里面。这可能因JVM而异,但JLS保证在需要静态初始化时会加载一个类。
对于给定的命名空间,类加载仅执行一次,除非相关类先前已被卸载。因此,等效表达式A.class.getClassLoader().loadClass("B's canonical name")在大多数情况下只会执行一次。换句话说,如果您有两个表达式 - new A(),则 loadClass 将只执行一次。
添加回答
举报
0/150
提交
取消