【问题标题】:Is the Class object A created when the JVM loads class A, or when I call A.class?Class对象A是JVM加载A类时创建的,还是我调用A.class时创建的?
【发布时间】:2015-12-25 12:20:36
【问题描述】:

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

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

这会锁定AClass 对象,对吧?这个Class 对象是什么时候创建的?它是在 JVM 加载 A 类时创建的,还是在我调用 A.class 时创建的?我在 JLS 中找不到详细信息,有人可以提供有关它的链接吗?

【问题讨论】:

    标签: java class jvm synchronize


    【解决方案1】:

    它是在 JVM 加载类时创建的,如 Javadocs 状态:

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

    【讨论】:

    【解决方案2】:

    这会锁定 A 的 Class 对象,对吧?

    是的。

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

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

    我在 JLS 中找不到详细信息,谁能提供有关它的链接,谢谢。

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

    【讨论】:

    • 嗨,彼得,同样的问题,可以 gc 吗?
    • @Tony 一个类只有在它的类加载器被 GC 时才能被 GC。这意味着类加载器的所有类的所有实例不再被强引用。主/默认 ClassLoader 永远不会被 GC。
    • 谢谢,A a = new A(),我可以说a是A类的一个实例,但是A的Class对象是谁的实例,如果它属于A,我不认为a = 类对象
    • @PeterLawrey 这只是理论上的。在实践中,类加载器永远不会被垃圾回收
    • @Gaskoin 我不这么认为,用你的话来说,类永远不会被 GC'ed,对吧?我们可以有自定义的类加载器。
    【解决方案3】:

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

    5.3. Creation and Loading

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

    【讨论】:

      【解决方案4】:

      是JVM加载A类时创建的

      是的。

      或者当我调用 A.class 时?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 2018-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多