【问题标题】:JAVA - Difference between Class class and *.class files?JAVA - Class 类和 *.class 文件之间的区别?
【发布时间】:2018-05-17 12:00:42
【问题描述】:

在 *.class 文件和 Class 类 API 之间有一些我不明白的地方。让我解释一下:

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

public class A { ... }

Class<?> clazz = A.class;

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

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

谢谢

【问题讨论】:

  • "A.class 文件(字节码)和代表实例类的clazz 之间是否有任何关系(A.class)? - 是的。 Class&lt;A&gt; 是您的类型 A 的面向对象表示。只需查看 documentation of Class 即可了解您可以用它做什么。
  • Class clazz 就像变量( String a )。其中包含A.class 的内容
  • instance class 是什么? A.class 给你一个java.lang.Class 的实例,它使你能够例如对该类使用反射。
  • .class 的字节被加载到一个类中。对于其余类是一个内部对象,有结构,JVM中的代码,JVM常量池中的常量,

标签: java class oop reflection jvm


【解决方案1】:

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

【讨论】:

  • 这指出了.class-files 和它们作为Class-instance 的表示之间的一些差异。但 OP 要求的是它们之间的关系,而不是差异。
  • 部分问题是 JAVA - Class 类和 *.class 文件之间的区别?....
  • @Turing85 :所以如果我对差异的看法是正确的: 1) *.class 磁盘上的文件代表翻译成字节码的类的 java 代码。 2) A.class 对象代表堆上的内存。在 A.class 对象内部有内存来存储此类的实例变量。这是正确的吗?
  • @AntonBoarf 不,你编的。 Class 对象包含关于类的信息,而不是它的所有实例。
  • @EJP 但是类对象是一个对象,所以它存在于堆上。我认为与类信息相关的所有内容都在方法区域(而不是堆)上。
【解决方案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 引用它,表明这个构造受标准源代码名称解析规则的约束,并且不连接到编译类的文件名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多