是JVM加载A类时,还是当我调用A.class时创建的Class对象?

时间:2015-09-28 09:41:33

标签: java class jvm synchronize

据我所知,每个班级都有一个Class个对象。我使用同步时有一种情况,例如:

public class A {
    public static void main(String... args){
        synchronize(A.class){
            //do something...
        }
    }
}

这会锁定A的{​​{1}}对象,对吗?这个Class对象何时创建?它是在JVM加载Class类时还是在调用A时创建的?我在JLS中找不到详细信息,有人可以提供有关它的链接吗?

4 个答案:

答案 0 :(得分:7)

  

这将锁定A的Class对象,对吗?

  

我的问题是什么时候创建了这个Class对象?它是在JVM加载A类时创建的,还是在我调用A.class?

时创建的

当ClassLoader加载它时,它会返回一个Class对象。

  

我无法在JLS中找到详细信息,有人可以提供有关它的链接,谢谢。

我建议阅读ClassLoader.loadClass()

的javadoc

答案 1 :(得分:2)

首次使用该类时,ClassLoader会初始化一个类JLS 5.3

  

5.3. Creation and Loading

     

创建由名称N表示的类或接口C   Java虚拟机的方法区域中的构造   (§2.5.4)C的特定于实现的内部表示。   类或接口创建由另一个类或接口D触发,它通过其运行时常量池引用C 。    D调用也可以触发类或接口创建   某些Java SE平台类库(第2.12节)中的方法,如   反射

答案 2 :(得分:1)

当JVM将类加载为Javadocs状态时创建它:

  

Class没有公共构造函数。相反,Class对象由Java虚拟机在加载类时自动构造,并通过调用类加载器中的defineClass方法。

答案 3 :(得分:0)

  

是否在JVM加载A类

时创建

  

或当我打电话给A.class?

没有。除了反射的特殊情况之外,JVM在加载使用它的类时加载A,这里不适用。