java - Java 类文件可以使用保留关键字作为名称吗?

标签 java reflection jvm .class-file

我知道 Java-the-compilable-programming-language 与 Java-the-bytecode-format-for-JVM-execution 不同。有一些在 .class 格式中有效但在 .java 源代码中无效的示例,例如无构造函数的类和合成方法。

  1. 如果我们手工制作一个带有 Java 语言保留关键字(例如 intwhile)的 .class 文件作为类、方法或字段名,Java 虚拟机会接受它进行加载吗?

  2. 如果加载了类,是否意味着访问该类或成员的唯一方法是通过 Java 反射,因为在 Java 编程语言中该名称在语法上是非法的?

最佳答案

是的,您可以使用保留字。这些词仅适用于编译器。它们不会出现在生成的字节码中。

使用 Java 保留字的一个例子是在基于 JVM 的 Scala 语言中。 Scala 的结构和语法与 Java 不同,但编译为 Java 字节码,以便在 JVM 上运行。

这是合法的 Scala:

class `class`

这定义了一个名为 class 的类,它带有一个无参数的构造函数。在编译的 class.class 文件上运行 javap(反汇编程序)显示

public class class {
    public class();
}

Scala 可以对任何其他 Java 保留字执行相同的操作。

class int
class `while`
class goto

它们也可用于方法或字段名称。

正如您所怀疑的,除了反射之外,您无法在 Java 中使用这些类。您可以从类似的“自定义”类文件中使用这些,例如来自 Scala 编译器生成的类文件。

总而言之,这是 javac(编译器)的限制,而不是 java(VM/运行时环境)的限制。

关于java - Java 类文件可以使用保留关键字作为名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30491035/

相关文章:

java - 如何在不扩展 Activity 的 java 类中使用 LayoutInflater 从 xml 文件获取 View

Java版本差异?

java - 泰坦多ID查询

javascript - 在 javascript 中使用反射来获取失败时测试函数的名称

jvm - 为什么 JVM 被认为是如此出色的软件工程?

java - 如何阅读 jvm 崩溃报告?报告的原因可能是什么

java - JVM在使用synchronized时如何保证被引用对象中成员变量修改的可见性?

java - 无协议(protocol)的 URL 验证

c# - 保留动态调用方法的异常

c# - 获取带有字符串值的类属性列表