我注意到我们可以随意设置线程的上下文类加载器。这是否意味着每个new
都会导致上下文类加载器的loadClass被调用?
答案 0 :(得分:4)
否,loadClass()
仅在第一次访问该类时被调用一次。 (这不一定会在new()
上发生,如果您尝试访问该类的static
成员,则可能会发生。)
在对该类的每次后续访问中,将不会调用loadClass()
。
那是因为每次需要该类时,ClassLoader都会在内部调用findClass()
,这会尝试查找已加载的类,因此,如果该类已被加载,则ClassLoader不会调用loadClass()
再次。
答案 1 :(得分:0)
类加载,以尽快加载一个类,或者另一个类延迟加载,直到需要初始化类为止,但是您请注意,某些情况下的行为可能与 new 并不完全相同,而在其他情况下则可能相同。如果Class在实际使用之前加载,则可以在初始化之前放入其中。这可能因JVM而异,但是JLS保证在需要静态初始化时将加载类。
(如What does "new" do in Java w.r.t. class loader?中所述:
对于给定的名称空间,仅一次执行类加载,除非 有问题的类先前已卸载。因此, 等效表达式 A.class.getClassLoader()。loadClass(“ B的 规范名称”)在大多数情况下将只执行一次。 换句话说,如果您有两个表达式-new A(),loadClass将 只能执行一次。