获取所有Java保留关键字的列表

use*_*680 6 java regex reserved-words keyword

我正在寻找一种方法来将Java中保存的所有关键字检索到某种数据结构中.例如:"for,while,if,else,int,double等"

我需要对字符串进行名称验证,具体来说,我需要确保它不等于任何java关键字.

有没有一种特定的方法可以将所有关键字检索到一个数据结构中?或者我是否需要构建一个包含所有这些关键字的正则表达式字符串:"for | while | if | ..."并尝试匹配我的字符串?

谢谢

eve*_*ime 10

来自axis.apache.org

基本上,对关键字进行预排序并将其存储在一个数组中,并在关键字上使用Arrays.binarySearch以获得good'ol O(logn)复杂度

import java.util.Arrays;

    public class MainDemo {
        static final String keywords[] = { "abstract", "assert", "boolean",
                "break", "byte", "case", "catch", "char", "class", "const",
                "continue", "default", "do", "double", "else", "extends", "false",
                "final", "finally", "float", "for", "goto", "if", "implements",
                "import", "instanceof", "int", "interface", "long", "native",
                "new", "null", "package", "private", "protected", "public",
                "return", "short", "static", "strictfp", "super", "switch",
                "synchronized", "this", "throw", "throws", "transient", "true",
                "try", "void", "volatile", "while" };

        public static boolean isJavaKeyword(String keyword) {
            return (Arrays.binarySearch(keywords, keyword) >= 0);
        }

        //Main method
        public static void main(String[] args) {
            System.out.println(isJavaKeyword("void"));

        }

    }
Run Code Online (Sandbox Code Playgroud)

输出:

真正


或者,作为用户@typeracer,@ holger在评论中建议,您可以使用SourceVersion.isKeyword("void") 它在内部使用 javax.lang.model.SourceVersion库和Hashset数据结构,并为您更新列表.


typ*_*cer 5

我很惊讶没有人建议javax.lang.model.SourceVersion,因为它实际上从 Java 1.6 就已经存在了。

如果你需要检查某个字符串是否是保留关键字,你可以调用:

SourceVersion.isKeyword(str)
Run Code Online (Sandbox Code Playgroud)

如果您确实需要保留关键字的完整列表,您可以从该类的源代码中获取它:

private final static Set<String> keywords;
static {
    Set<String> s = new HashSet<String>();
    String [] kws = {
        "abstract", "continue",     "for",          "new",          "switch",
        "assert",   "default",      "if",           "package",      "synchronized",
        "boolean",  "do",           "goto",         "private",      "this",
        "break",    "double",       "implements",   "protected",    "throw",
        "byte",     "else",         "import",       "public",       "throws",
        "case",     "enum",         "instanceof",   "return",       "transient",
        "catch",    "extends",      "int",          "short",        "try",
        "char",     "final",        "interface",    "static",       "void",
        "class",    "finally",      "long",         "strictfp",     "volatile",
        "const",    "float",        "native",       "super",        "while",
        // literals
        "null",     "true",         "false"
    };
    for(String kw : kws)
        s.add(kw);
    keywords = Collections.unmodifiableSet(s);
}
Run Code Online (Sandbox Code Playgroud)

注意:上述源代码来自Java 1.8,因此,如果您使用的是不同版本的 Java,请不要直接从本文复制粘贴。事实上,复制它可能根本不是一个好主意——他们将这个字段设为私有是有充分理由的——您可能不想在每个新的 Java 版本中都保持它是最新的。但如果您绝对必须拥有它,请从您自己的 JDK 发行版中的源代码中复制它,请记住,您以后可能需要手动不断更新它。