是在JVM加载类A或调用类A时创建的类对象A



据我所知,每个类都有一个Class对象。有一种情况我使用了synchronize,例如:

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

这将锁定AClass对象,对吗?这个Class对象是什么时候创建的?它是在JVM加载A类时创建的还是在我调用A.class时创建的?我在JLS里找不到细节,有没有人能提供一下链接?

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

是的。

我的问题是什么时候创建这个类对象?它是创建在JVM加载类或当我调用A类?

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

我在JLS里找不到细节,有没有人能提供一下链接,谢谢。

我建议阅读javadoc的ClassLoader.loadClass()

它是在JVM加载类时创建的,如Javadocs所述:

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

类在第一次使用时由ClassLoader初始化,JLS 5.3:

5.3。创建和加载

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

是否在JVM加载A类时创建

是的。

或者当我调用A.class时?

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

最新更新