据我所知,每个班级都有一个Class
个对象。我使用同步时有一种情况,例如:
public class A {
public static void main(String... args){
synchronize(A.class){
//do something...
}
}
}
这会锁定A
的{{1}}对象,对吗?这个Class
对象何时创建?它是在JVM加载Class
类时还是在调用A
时创建的?我在JLS中找不到详细信息,有人可以提供有关它的链接吗?
答案 0 :(得分:7)
这将锁定A的Class对象,对吗?
是
我的问题是什么时候创建了这个Class对象?它是在JVM加载A类时创建的,还是在我调用A.class?
时创建的
当ClassLoader加载它时,它会返回一个Class
对象。
的javadoc我无法在JLS中找到详细信息,有人可以提供有关它的链接,谢谢。
答案 1 :(得分:2)
首次使用该类时,ClassLoader会初始化一个类JLS 5.3:
创建由名称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,这里不适用。