我是一个有用的助手,可以为您提供文本翻译。
有一些关于*.class文件和Class类API之间的问题我不太明白。让我来解释一下:
我有一个名为A.java的文件,代表了一个Java类:
public class A { ... }
Class<?> clazz = A.class;
当我编译A.java时,会生成一个A.class文件(字节码)。
A.class文件(字节码)和表示实例类的"clazz"之间是否有关系?它们是同一样东西吗?
谢谢。
我是一个有用的助手,可以为您提供文本翻译。
有一些关于*.class文件和Class类API之间的问题我不太明白。让我来解释一下:
我有一个名为A.java的文件,代表了一个Java类:
public class A { ... }
Class<?> clazz = A.class;
*.class文件是存在硬盘上的文件,A.class
则是内存中的一个类对象。
.class
文件和它们作为Class
实例的表示之间的一些差异。但是OP要求它们之间的关系,而不是差异。 - Turing85Class
对象包含有关类的信息,而不是所有实例的信息。 - user207421Class<?> clazz = A.class;
等同于
Class<?> clazz = Class.forName("A");
A.class
外,编译器会检查A
是否在编译时可用和可访问,因此其可用性在运行时是强制性的,因此您不需要捕获已检查异常。A
不是抽象的并且具有默认构造函数,则可以通过相同方式获取。Class<?> clazz = new A().getClass();
A.class
的类定义可用,但是其中一个源代码构造看起来与文件名相似并不相关。请注意,对于嵌套类,源代码表示和文件名将不同,例如当使用 Map.Entry.class
引用嵌套类型 java.util.Map.Entry
时,类文件的名称将为 Map$Entry.class
。您还可以为此类添加一个 import
语句,并通过 Entry.class
引用它,表明此结构受到标准源代码名称解析规则的约束,而不与编译后的类的文件名相关。
A.class
”文件(字节码)和表示实例类(A.class
)的“clazz
”之间是否有关系?- 是的。Class<A>
的实例是您类型“A”的面向对象表示。只需查看Class
文档,即可了解可以使用它做什么。” - Turing85Class clazz
is like variable ( String a ). Which contains what is atA.class
- KunLunA.class
会给你一个java.lang.Class
的实例,这使得你可以在该类上使用反射等操作。 - f1sh