是否有任何包来存储java关键字的集合

时间:2016-02-29 17:54:58

标签: java

所有关键字都存储在java中?是否存在用于存储关键字集的任何包(预定义事物)因为这些与任何"类(大写C)无关,但是"类"(小c)本身是关键字,并且所有原始类型,所有说明符,接口都是关键字。但它们存放在哪里?绝对不在任何类中(它们必须在某个包或某个地方定义)但在哪里?

2 个答案:

答案 0 :(得分:1)

所有关键字都存储在java 运行时库中,这是值得怀疑的,因为那里不需要它们。
但是,在编译器中需要它们。

快速查看JDK langtools repo之后,我发现:

  • com.sun.tools.javac.antlr.Java.g4(文本文件)
    包含关键字列表:

    // §3.9 Keywords
    
    ABSTRACT : 'abstract';
    ASSERT : 'assert';
    BOOLEAN : 'boolean';
    BREAK : 'break';
    BYTE : 'byte';
    CASE : 'case';
    CATCH : 'catch';
    CHAR : 'char';
    CLASS : 'class';
    CONST : 'const';
    CONTINUE : 'continue';
    DEFAULT : 'default';
    DO : 'do';
    DOUBLE : 'double';
    ELSE : 'else';
    ENUM : 'enum';
    EXTENDS : 'extends';
    FINAL : 'final';
    FINALLY : 'finally';
    FLOAT : 'float';
    FOR : 'for';
    IF : 'if';
    GOTO : 'goto';
    IMPLEMENTS : 'implements';
    IMPORT : 'import';
    INSTANCEOF : 'instanceof';
    INT : 'int';
    INTERFACE : 'interface';
    LONG : 'long';
    NATIVE : 'native';
    NEW : 'new';
    PACKAGE : 'package';
    PRIVATE : 'private';
    PROTECTED : 'protected';
    PUBLIC : 'public';
    RETURN : 'return';
    SHORT : 'short';
    STATIC : 'static';
    STRICTFP : 'strictfp';
    SUPER : 'super';
    SWITCH : 'switch';
    SYNCHRONIZED : 'synchronized';
    THIS : 'this';
    THROW : 'throw';
    THROWS : 'throws';
    TRANSIENT : 'transient';
    TRY : 'try';
    VOID : 'void';
    VOLATILE : 'volatile';
    WHILE : 'while';
    

    我不确定该文件是否也包含在分布式javac中,因此可以在运行时检索。

  • com.sun.tools.javac.parser.Tokens(普通的java类)
    包含一个子类枚举TokenKind,它包含所有标记 虽然这些肯定可以在运行时检索,但它们还包括运算符,文件结束表示等,因此您必须先过滤它们。

答案 1 :(得分:0)

理论上,运行已编译代码的Java运行时环境不需要保留关键字。编译完成后,所有代码都变成字节码。例如,私有方法将用标志而不是字母串p-r-i-v-a-t-e标记。 for循环将由一些字节代码表示,该代码设置变量的初始值,执行操作,递增值,检查条件,然后跳回操作的开头。不需要将三个字母f-o-r存储在任何地方。

但是,标准Java在运行时库中确实有一个包含所有Java关键字的类 - SourceVersion enum in the javax.lang.model package。这个枚举有一个接受CharSequence的方法,并检查它是否是Java最新版本中的关键字(显然是运行版本)。

提供javax.lang.model包是为了对Java语言进行建模。例如,它由处理注释的程序或自己编译Java程序的程序使用。

SourceVersion枚举存储所有关键字,但它并不能让您使用它们。 API仅允许您检查字符串是否是关键字。