* .class文件和Class class API之间有一些我不理解的东西。我来解释一下:
我有一个代表java类的文件A.java:
public class A { ... }
Class<?> clazz = A.class;
当我编译A.java时,我得到一个A.class文件(字节代码)。
A.class文件(字节码)和代表实例类(A.class)的clazz之间是否有任何关系?它们是一样的吗?
谢谢
答案 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
引用它,表明此构造受标准源代码名称解析规则的约束,并且未连接到已编译类的文件名