JAVA-类和*.Class文件之间的区别?

JAVA-类和*.Class文件之间的区别?,java,class,oop,reflection,jvm,Java,Class,Oop,Reflection,Jvm,在*.class文件和类API之间有一些我不理解的地方。让我解释一下: 我有一个代表java类的文件a.java: public class A { ... } Class<?> clazz = A.class; 公共类A{…} clazz类=A类; 当我编译A.java时,我得到一个A.class文件(字节码) A.class文件(字节码)和表示实例类(A.class)的clazz之间是否存在任何关系?它们是一样的吗 谢谢*。类文件是磁盘上的文件,A.class是内存中的类对

在*.class文件和类API之间有一些我不理解的地方。让我解释一下:

我有一个代表java类的文件a.java:

public class A { ... }

Class<?> clazz = A.class;
公共类A{…}
clazz类=A类;
当我编译A.java时,我得到一个A.class文件(字节码)

A.class文件(字节码)和表示实例类(A.class)的clazz之间是否存在任何关系?它们是一样的吗


谢谢

*。类文件是磁盘上的文件,
A.class
是内存中的类对象

Class<?> clazz = A.class;
当然,所有这些构造都取决于运行时
a
的类定义的可用性,该类定义通常以类文件名
a.class
的形式提供,但这些源代码构造中的一个看起来与文件名相似的事实并不相关


请注意,对于嵌套类,源代码表示形式和文件名将有所不同,例如,当使用
Map.Entry.class
引用嵌套类型
java.util.Map.Entry
时,类文件的名称将为
Map$Entry.class
。您还可以为此类添加一个
import
语句,并通过
Entry.class
引用它,表明此构造受标准源代码名称解析规则的约束,并且未连接到已编译类的文件名。

“A.class文件(字节码)之间是否存在任何关系?”和表示实例类(
A.class
)的
clazz
?-是的。查看
类的实例可以对其执行什么操作。
class clazz
类似于变量(字符串A).包含
A.class
什么是
实例类
A.class
提供了
java.lang.class
的一个实例,使您能够对该类使用反射。类的字节加载到一个类中。对于其余类,它是一个具有结构的内部对象,并且是JVM中的代码,constant在JVM的常量池中,这指出了
.class
-文件和它们作为
-实例的表示之间的一些差异。但是OP问的是它们之间的关系,而不是差异。部分问题是JAVA-类和*.class文件之间的差异?…@Turing85:如果我是正确的ut差异:1)*.磁盘上的类文件表示转换为字节码的类的java代码。2)A.class对象表示堆上的内存。A.class对象内有内存存储该类的实例变量。这是否正确?@AntonBoarf否。是您编的。
对象包含有关cl的信息ass,不是它的所有实例。@EJP但是类对象是一个对象,所以它存在于堆上。我认为所有与类相关的信息都在方法区域(不是堆)上。
Class<?> clazz = Class.forName("A");
Class<?> clazz = new A().getClass();