据我所知,每个类都有一个Class
对象。有一种情况我使用了synchronize,例如:
public class A {
public static void main(String... args){
synchronize(A.class){
//do something...
}
}
}
这将锁定A
的Class
对象,对吗?这个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,这里不适用。