JAVA - Class类和*.class文件的区别是什么?

7

我是一个有用的助手,可以为您提供文本翻译。

有一些关于*.class文件和Class类API之间的问题我不太明白。让我来解释一下:

我有一个名为A.java的文件,代表了一个Java类:

public class A { ... }

Class<?> clazz = A.class;

当我编译A.java时,会生成一个A.class文件(字节码)。
A.class文件(字节码)和表示实例类的"clazz"之间是否有关系?它们是同一样东西吗?
谢谢。

2
A.class”文件(字节码)和表示实例类(A.class)的“clazz”之间是否有关系?- 是的。 Class<A>的实例是您类型“A”的面向对象表示。只需查看Class文档,即可了解可以使用它做什么。” - Turing85
Class clazz is like variable ( String a ). Which contains what is at A.class - KunLun
什么是“实例类”?A.class会给你一个java.lang.Class的实例,这使得你可以在该类上使用反射等操作。 - f1sh
.class 的字节被加载到一个 Class 中。对于其余的 Class,它是一个具有结构和 JVM 中代码、JVM 常量池中常量的内部对象。 - Joop Eggen
2个回答

5

*.class文件是存在硬盘上的文件,A.class则是内存中的一个类对象。


1
这指出了.class文件和它们作为Class实例的表示之间的一些差异。但是OP要求它们之间的关系,而不是差异。 - Turing85
2
问题的一部分是:JAVA - Class类和*.class文件之间的区别是什么? - xingbin
@Turing85:如果我对以下差异的理解是正确的:1)磁盘上的*.class文件代表已转换为字节码的类的Java代码。2)A.class对象代表堆上的内存。在A.class对象内部,有内存用于存储该类的实例变量。这个理解正确吗? - AntonBoarf
@AntonBoarf 不对。这是你自己编造的。Class对象包含有关类的信息,而不是所有实例的信息。 - user207421
@EJP 但是类对象是一个对象,所以它在堆上存储。我认为与类相关的所有信息都在方法区(而不是堆)中。 - AntonBoarf

1
Class<?> clazz = A.class;

等同于

Class<?> clazz = Class.forName("A");

除了类字面量A.class外,编译器会检查A是否在编译时可用和可访问,因此其可用性在运行时是强制性的,因此您不需要捕获已检查异常。
如果A不是抽象的并且具有默认构造函数,则可以通过相同方式获取。
Class<?> clazz = new A().getClass();

当然,所有这些结构都依赖于在运行时有一个名为 A.class 的类定义可用,但是其中一个源代码构造看起来与文件名相似并不相关。请注意,对于嵌套类,源代码表示和文件名将不同,例如当使用 Map.Entry.class 引用嵌套类型 java.util.Map.Entry 时,类文件的名称将为 Map$Entry.class。您还可以为此类添加一个 import 语句,并通过 Entry.class 引用它,表明此结构受到标准源代码名称解析规则的约束,而不与编译后的类的文件名相关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接