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

纳幸

我知道Java可编译程序设计语言不是一种与JVM执行Java字节码格式相同的语言。有些示例在.class格式中有效,但在.java源代码中无效,例如无构造函数的类和合成方法。

  1. 如果我们的手工工艺.class文件有保留的Java语言的关键字(例如intwhile)作为类,方法或字段名,将在Java虚拟机接受它加载?

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

在字节码级别上对类名称的唯一限制是它们不能包含字符[.或者;它们的最大长度为65535字节。除其他外,这意味着您可以自由使用保留字,空格,特殊字符,Unicode甚至是换行符之类的怪异东西。

从理论上讲,您甚至可以在类名称中使用空字符,但是由于文件名中不可能包含空字符,因此您不能在jar中包含这样的类文件。您也许可以动态创建和加载一个。

这是您可以做的一些事情的示例(用Krakatau程序集编写):

; Entry point for the jar
.class Main
.super java/lang/Object

.method public static main : ([Ljava/lang/String;)V
    .limit stack 10
    .limit locals 10
    invokestatic int                                hello ()V
    invokestatic "-42"                              hello ()V
    invokestatic ""                                 hello ()V
    invokestatic "  some  whitespace and \t tabs"   hello ()V
    invokestatic "new\nline"                        hello ()V
    invokestatic 'name with "Quotes" in it'         hello ()V
    return
.end method
.end class


.class int
.super java/lang/Object
.method public static hello : ()V
    .limit stack 2
    .limit locals 0
    getstatic java/lang/System out Ljava/io/PrintStream;
    ldc "Hello from int"
    invokevirtual java/io/PrintStream println (Ljava/lang/Object;)V
    return
.end method
.end class

.class "-42"
.super java/lang/Object
.method public static hello : ()V
    .limit stack 2
    .limit locals 0
    getstatic java/lang/System out Ljava/io/PrintStream;
    ldc "Hello from -42"
    invokevirtual java/io/PrintStream println (Ljava/lang/Object;)V
    return
.end method
.end class

; Even the empty string can be a class name!
.class ""
.super java/lang/Object
.method public static hello : ()V
    .limit stack 2
    .limit locals 0
    getstatic java/lang/System out Ljava/io/PrintStream;
    ldc "Hello from "
    invokevirtual java/io/PrintStream println (Ljava/lang/Object;)V
    return
.end method
.end class

.class "  some  whitespace and \t tabs"
.super java/lang/Object
.method public static hello : ()V
    .limit stack 2
    .limit locals 0
    getstatic java/lang/System out Ljava/io/PrintStream;
    ldc "Hello from   some  whitespace and \t tabs"
    invokevirtual java/io/PrintStream println (Ljava/lang/Object;)V
    return
.end method
.end class

.class "new\nline"
.super java/lang/Object
.method public static hello : ()V
    .limit stack 2
    .limit locals 0
    getstatic java/lang/System out Ljava/io/PrintStream;
    ldc "Hello from new\nline"
    invokevirtual java/io/PrintStream println (Ljava/lang/Object;)V
    return
.end method
.end class

.class 'name with "Quotes" in it'
.super java/lang/Object
.method public static hello : ()V
    .limit stack 2
    .limit locals 0
    getstatic java/lang/System out Ljava/io/PrintStream;
    ldc "Hello from name with \"Quotes\" in it"
    invokevirtual java/io/PrintStream println (Ljava/lang/Object;)V
    return
.end method
.end class

执行输出:

Hello from int
Hello from -42
Hello from
Hello from   some  whitespace and        tabs
Hello from new
line
Hello from name with "Quotes" in it

有关JVM规范中规则的确切引用,请参见Holger的答案

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我们可以使用Java关键字来命名类吗?

来自分类Dev

ReSharper可以使用关键字进行声明,但可以输入名称作为成员访问权限吗?

来自分类Dev

以关键字为名称的截断表

来自分类Dev

您可以使用Facebook的Flow注释未使用ES6 class关键字定义的类吗?

来自分类Dev

表名称作为Sqoop中的保留关键字

来自分类Dev

Django模型使用保留Python关键字作为数据库列名称

来自分类Dev

使用保留关键字作为Typescript中类/实例的方法

来自分类Dev

如果param的名称是python关键字,是否可以使用fastapi获取查询参数?

来自分类Dev

PHP中的非匿名函数可以使用'use'关键字吗?

来自分类Dev

我可以使用关键字“ in”以某种方式分隔方法声明中的参数吗?

来自分类Dev

Javascript-可以使用'import'关键字导入CSS吗?

来自分类Dev

我可以使用using关键字进行部分模板专业化吗?

来自分类Dev

如何在Swift中使用名称为Objective-C的类作为关键字

来自分类Dev

嵌入式文档和有没有一种方法可以使用“ type”关键字作为模型字段名称

来自分类Dev

使用保留关键字作为变量名创建Java对象

来自分类Dev

Java是JavaScript中的保留关键字吗?

来自分类Dev

在RobotFramework中可以使用哪些YAML关键字来编辑YAML文件?

来自分类Dev

在CF中,我可以使用变量作为名称来调用自定义标签吗?

来自分类Dev

在F#中使用关键字作为成员名称

来自分类Dev

在F#中使用关键字作为成员名称

来自分类Dev

我可以在类方法中使用static关键字吗?有什么后果?

来自分类Dev

如何在Swift中使用保留关键字作为类型名称声明和初始化嵌套枚举?

来自分类Dev

您可以使用类似于Java中python的关键字args的概念来最小化访问器方法的数量吗?

来自分类Dev

您可以在JAVA中覆盖THIS关键字吗

来自分类Dev

您可以在JAVA中覆盖THIS关键字吗

来自分类Dev

可以在特征上使用'new'关键字吗?

来自分类Dev

在创建新的对象/类时,闭包可以使用new关键字,例如,区别是什么

来自分类Dev

我们可以使用constant和returns关键字和a;改变solidity中变量的状态吗?

来自分类Dev

我可以使用内置名称作为Python类的方法名称吗?

Related 相关文章

  1. 1

    我们可以使用Java关键字来命名类吗?

  2. 2

    ReSharper可以使用关键字进行声明,但可以输入名称作为成员访问权限吗?

  3. 3

    以关键字为名称的截断表

  4. 4

    您可以使用Facebook的Flow注释未使用ES6 class关键字定义的类吗?

  5. 5

    表名称作为Sqoop中的保留关键字

  6. 6

    Django模型使用保留Python关键字作为数据库列名称

  7. 7

    使用保留关键字作为Typescript中类/实例的方法

  8. 8

    如果param的名称是python关键字,是否可以使用fastapi获取查询参数?

  9. 9

    PHP中的非匿名函数可以使用'use'关键字吗?

  10. 10

    我可以使用关键字“ in”以某种方式分隔方法声明中的参数吗?

  11. 11

    Javascript-可以使用'import'关键字导入CSS吗?

  12. 12

    我可以使用using关键字进行部分模板专业化吗?

  13. 13

    如何在Swift中使用名称为Objective-C的类作为关键字

  14. 14

    嵌入式文档和有没有一种方法可以使用“ type”关键字作为模型字段名称

  15. 15

    使用保留关键字作为变量名创建Java对象

  16. 16

    Java是JavaScript中的保留关键字吗?

  17. 17

    在RobotFramework中可以使用哪些YAML关键字来编辑YAML文件?

  18. 18

    在CF中,我可以使用变量作为名称来调用自定义标签吗?

  19. 19

    在F#中使用关键字作为成员名称

  20. 20

    在F#中使用关键字作为成员名称

  21. 21

    我可以在类方法中使用static关键字吗?有什么后果?

  22. 22

    如何在Swift中使用保留关键字作为类型名称声明和初始化嵌套枚举?

  23. 23

    您可以使用类似于Java中python的关键字args的概念来最小化访问器方法的数量吗?

  24. 24

    您可以在JAVA中覆盖THIS关键字吗

  25. 25

    您可以在JAVA中覆盖THIS关键字吗

  26. 26

    可以在特征上使用'new'关键字吗?

  27. 27

    在创建新的对象/类时,闭包可以使用new关键字,例如,区别是什么

  28. 28

    我们可以使用constant和returns关键字和a;改变solidity中变量的状态吗?

  29. 29

    我可以使用内置名称作为Python类的方法名称吗?

热门标签

归档