13

文字列をクラス名として使用できるかどうかを確認するJavaのメソッドはありますか?

4

4 に答える 4

26

SourceVersion.isName完全修飾名のチェックに使用できます。

s を許可しない場合は.、次の方法でチェックを行うことができます。

boolean isValidName (String className) {
    return SourceVersion.isIdentifier(className) && !SourceVersion.isKeyword(className);
}
于 2015-11-07T16:40:44.550 に答える
6

簡単に言えば、Class.forName(String name)次のようにこれをテストするために使用できるメソッドを使用します。

public static boolean classExists(String className)
{
    try
    {
        Class.forName(className);
        return true;
    }
    catch(ClassNotFoundException ex)
    {
        return false;
    }
}

編集: dashrb が言ったように、文字列をクラス名として使用できるかどうかを判断する方法を求めている場合 (その名前のクラスが既に存在する場合ではなく)、必要なのは上に投稿したメソッド (クラス名を再利用できないため、ブール値を反転したもの) と、文字列が Java 予約キーワードであるかどうかを確認するチェックと組み合わせて使用​​します。私は最近同様の問題を抱えていたので、ここで見つけることができるユーティリティクラスを作成しました。私はあなたのためにそれを書きませんが、基本的には のチェックを追加するだけです!JavaKeywords.isKeyword(className)

編集 2:もちろん、一般的に受け入れられているコーディング標準も適用したい場合は、クラス名が次のように大文字で始まることを確認できます。

return Character.isUpperCase(className.charAt(0));

編集 3 : Ted Hopp が指摘しているように、Java キーワードを含んでいてもクラス名が無効になり、本番アプリケーションの 1 つで JavaKeywords が使用されているため、この不測の事態もチェックするメソッドを含む更新バージョンを作成しました。containsKeyword(String toCheck)メソッドは次のとおりです (クラス内のキーワードのリストも必要であることに注意してください)。

public static boolean containsKeyword(String toCheck)
{
    toCheck = toCheck.toLowerCase();
    for(String keyword : keywords)
    {
        if(toCheck.equals(keyword) || toCheck.endsWith("." + keyword) ||
           toCheck.startsWith(keyword + ".") || toCheck.contains("." + keyword + "."))
        {
            return true;
        }//End if
    }//End for
    return false;
}//End containsKeyword()
于 2012-12-20T19:32:48.637 に答える
5

MrLore から提供された Java キーワードのリストを使用しました。

private static final Set<String> javaKeywords = new HashSet<String>(Arrays.asList(
    "abstract",     "assert",        "boolean",      "break",           "byte",
    "case",         "catch",         "char",         "class",           "const",
    "continue",     "default",       "do",           "double",          "else",
    "enum",         "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"
));

private static final Pattern JAVA_CLASS_NAME_PART_PATTERN =
    Pattern.compile("[A-Za-z_$]+[a-zA-Z0-9_$]*");

public static boolean isJavaClassName(String text) {
    for (String part : text.split("\\.")) {
        if (javaKeywords.contains(part) ||
                !JAVA_CLASS_NAME_PART_PATTERN.matcher(part).matches()) {
            return false;
        }           
    }
    return text.length() > 0;
}
于 2012-12-20T19:52:22.607 に答える
0

ヤップ -

Class.forName(String className);

指定された文字列名を持つクラスまたはインターフェースに関連付けられた Class オブジェクトを返します。そして投げるExceptions

LinkageError - if the linkage fails
ExceptionInInitializerError - if the initialization provoked by this method fails
ClassNotFoundException - if the class cannot be located
于 2012-12-20T19:32:18.580 に答える