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