JAVA-类和*.Class文件之间的区别?
在*.class文件和类API之间有一些我不理解的地方。让我解释一下: 我有一个代表java类的文件a.java:JAVA-类和*.Class文件之间的区别?,java,class,oop,reflection,jvm,Java,Class,Oop,Reflection,Jvm,在*.class文件和类API之间有一些我不理解的地方。让我解释一下: 我有一个代表java类的文件a.java: public class A { ... } Class<?> clazz = A.class; 公共类A{…} clazz类=A类; 当我编译A.java时,我得到一个A.class文件(字节码) A.class文件(字节码)和表示实例类(A.class)的clazz之间是否存在任何关系?它们是一样的吗 谢谢*。类文件是磁盘上的文件,A.class是内存中的类对
public class A { ... }
Class<?> clazz = A.class;
公共类A{…}
clazz类=A类;
当我编译A.java时,我得到一个A.class文件(字节码)
A.class文件(字节码)和表示实例类(A.class)的clazz之间是否存在任何关系?它们是一样的吗
谢谢*。类文件是磁盘上的文件,
A.class
是内存中的类对象
Class<?> clazz = A.class;
当然,所有这些构造都取决于运行时a
的类定义的可用性,该类定义通常以类文件名a.class
的形式提供,但这些源代码构造中的一个看起来与文件名相似的事实并不相关
请注意,对于嵌套类,源代码表示形式和文件名将有所不同,例如,当使用
Map.Entry.class
引用嵌套类型java.util.Map.Entry
时,类文件的名称将为Map$Entry.class
。您还可以为此类添加一个import
语句,并通过Entry.class
引用它,表明此构造受标准源代码名称解析规则的约束,并且未连接到已编译类的文件名。“A.class文件(字节码)之间是否存在任何关系?”和表示实例类(A.class
)的clazz
?-是的。查看类的实例可以对其执行什么操作。class clazz
类似于变量(字符串A).包含A.class
什么是实例类
?A.class
提供了java.lang.class
的一个实例,使您能够对该类使用反射。类的字节加载到一个类中。对于其余类,它是一个具有结构的内部对象,并且是JVM中的代码,constant在JVM的常量池中,这指出了.class
-文件和它们作为类
-实例的表示之间的一些差异。但是OP问的是它们之间的关系,而不是差异。部分问题是JAVA-类和*.class文件之间的差异?…@Turing85:如果我是正确的ut差异:1)*.磁盘上的类文件表示转换为字节码的类的java代码。2)A.class对象表示堆上的内存。A.class对象内有内存存储该类的实例变量。这是否正确?@AntonBoarf否。是您编的。类
对象包含有关cl的信息ass,不是它的所有实例。@EJP但是类对象是一个对象,所以它存在于堆上。我认为所有与类相关的信息都在方法区域(不是堆)上。
Class<?> clazz = Class.forName("A");
Class<?> clazz = new A().getClass();