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

时间:2018-05-17 12:00:42

标签: java class oop reflection jvm

* .class文件和Class class API之间有一些我不理解的东西。我来解释一下:

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

public class A { ... }

Class<?> clazz = A.class;

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

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

谢谢

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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引用它,表明此构造受标准源代码名称解析规则的约束,并且未连接到已编译类的文件名