是否每个“新”都会导致至少一个Classloader.loadClass调用

时间:2018-09-12 12:04:41

标签: java

我注意到我们可以随意设置线程的上下文类加载器。这是否意味着每个new都会导致上下文类加载器的loadClass被调用?

2 个答案:

答案 0 :(得分:4)

否,loadClass()仅在第一次访问该类时被调用一次。 (这不一定会在new()上发生,如果您尝试访问该类的static成员,则可能会发生。)

在对该类的每次后续访问中,将不会调用loadClass()

那是因为每次需要该类时,ClassLoader都会在内部调用findClass(),这会尝试查找已加载的类,因此,如果该类已被加载,则ClassLoader不会调用loadClass()再次。

答案 1 :(得分:0)

可以实现ClassLoaders的

类加载,以尽快加载一个类,或者另一个类延迟加载,直到需要初始化类为止,但是您请注意,某些情况下的行为可能与 new 并不完全相同,而在其他情况下则可能相同。如果Class在实际使用之前加载,则可以在初始化之前放入其中。这可能因JVM而异,但是JLS保证在需要静态初始化时将加载类。

(如What does "new" do in Java w.r.t. class loader?中所述:

  

对于给定的名称空间,仅一次执行类加载,除非   有问题的类先前已卸载。因此,   等效表达式 A.class.getClassLoader()。loadClass(“ B的   规范名称”)在大多数情况下将只执行一次。   换句话说,如果您有两个表达式-new A(),loadClass将   只能执行一次。