提问人:AntonBoarf 提问时间:5/17/2018 最后编辑:f1shAntonBoarf 更新时间:5/17/2018 访问量:653
JAVA - 类类和 *.class 文件之间的区别?
JAVA - Difference between Class class and *.class files?
问:
*.class 文件和类类 API 之间有一些我不明白的东西。让我解释一下:
我有一个文件A.java表示java类:
public class A { ... }
Class<?> clazz = A.class;
当我编译 A.java 时,我得到一个 A.class 文件(字节码)。
A.class文件(字节码)和表示实例类(A.class)的clazz之间有什么关系吗?它们是一回事吗?
谢谢
答:
5赞
xingbin
5/17/2018
#1
*.class文件是磁盘上的文件,是内存中的类对象。A.class
评论
1赞
Turing85
5/17/2018
这指出了 -files 及其作为 -instance 的表示形式的一些差异。但OP要求的是它们之间的关系,而不是差异。.class
Class
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.class
A
如果不是抽象的并且有一个默认的构造函数,你会得到相同的A
Class<?> clazz = new A().getClass();
当然,所有这些构造都取决于运行时类定义的可用性,该定义通常以类文件名提供,但这些源代码构造之一看起来与文件名相似这一事实无关紧要。A
A.class
请注意,对于嵌套类,源代码表示和文件名会有所不同,例如,当用于引用嵌套类型时,类文件的名称将是 .您还可以为此类添加一个语句,并通过 引用它,表明此构造受标准源代码名称解析规则的约束,并且不连接到已编译类的文件名。Map.Entry.class
java.util.Map.Entry
Map$Entry.class
import
Entry.class
上一个:处理流的异常
评论
A.class
文件(字节码)和表示实例类(A.class
)的clazz
之间有什么关系吗?-是的。的实例是 your 类型的对象表示形式。只需查看Class
的文档,即可了解您可以用它做什么。Class<A>
A
Class clazz
就像变量(字符串 a )。其中包含A.class
instance class
A.class
java.lang.Class