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

JAVA - Difference between Class class and *.class files?

提问人:AntonBoarf 提问时间:5/17/2018 最后编辑:f1shAntonBoarf 更新时间:5/17/2018 访问量:653

问:

*.class 文件和类类 API 之间有一些我不明白的东西。让我解释一下:

我有一个文件A.java表示java类:

public class A { ... }

Class<?> clazz = A.class;

当我编译 A.java 时,我得到一个 A.class 文件(字节码)。

A.class文件(字节码)和表示实例类(A.class)的clazz之间有什么关系吗?它们是一回事吗?

谢谢

Java OOP 反射 JVM

评论

2赞 Turing85 5/17/2018
"A.class文件(字节码)和表示实例类(A.class)的clazz之间有什么关系吗?-是的。的实例是 your 类型的对象表示形式。只需查看 Class 的文档,即可了解您可以用它做什么。Class<A>A
0赞 KunLun 5/17/2018
Class clazz就像变量(字符串 a )。其中包含A.class
0赞 f1sh 5/17/2018
什么是 ? 给你一个实例,它使你能够例如在该类上使用反射。instance classA.classjava.lang.Class
0赞 Joop Eggen 5/17/2018
.class 的字节被加载到一个类中。对于其余的类是一个内部对象,其结构和 JVM 中的代码,JVM 常量池中的常量,

答:

5赞 xingbin 5/17/2018 #1

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

评论

1赞 Turing85 5/17/2018
这指出了 -files 及其作为 -instance 的表示形式的一些差异。但OP要求的是它们之间的关系,而不是差异。.classClass
2赞 xingbin 5/17/2018
部分问题是 JAVA - 类类和 *.class 文件之间的区别?....
0赞 AntonBoarf 5/17/2018
@Turing85 : 所以如果我对差异的看法是正确的: 1) *磁盘上的.class文件表示转换为字节码的类的 java 代码。2) .class 对象在堆上表示内存。在 A.class 对象中,有内存来存储此类的实例变量。这是正确的吗?
0赞 user207421 5/17/2018
@AntonBoarf号是你编的。该对象包含有关类的信息,而不是其所有实例。Class
0赞 AntonBoarf 5/18/2018
@EJP 但是类对象是一个对象,所以它存在于堆上。我认为与类信息相关的所有内容都在方法区域(而不是堆)上。
1赞 Holger 5/17/2018 #2
Class<?> clazz = A.class;

相当于

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

除了对于类文字 之外,编译器将检查在编译时是否可用和可访问,因此其可用性在运行时是强制性的。因此,您不需要捕获选中的异常。A.classA

如果不是抽象的并且有一个默认的构造函数,你会得到相同的A

Class<?> clazz = new A().getClass();

当然,所有这些构造都取决于运行时类定义的可用性,该定义通常以类文件名提供,但这些源代码构造之一看起来与文件名相似这一事实无关紧要。AA.class

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


上一个:处理流的异常

下一个:Java 和 @annotations