fab*_*ian 21
SourceVersion.isName 可用于检查完全限定名称.
如果不允许.s,则可以通过以下方式进行检查:
boolean isValidName (String className) {
return SourceVersion.isIdentifier(className) && !SourceVersion.isKeyword(className);
}
Run Code Online (Sandbox Code Playgroud)
很简单,使用该Class.forName(String name)方法,可用于测试如下:
public static boolean classExists(String className)
{
try
{
Class.forName(className);
return true;
}
catch(ClassNotFoundException ex)
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果像dashrb所说的那样,你要求一种方法来确定一个String是否可以用作类名(而不是如果已经有一个类名),那么你需要的是一个组合我在上面发布的方法(由于你不能重复使用类的名称而翻转了布尔值),并结合检查来查看String是否是Java保留的关键字.我最近有一个类似的问题,并为它做了一个实用工具类,你可以在这里找到.我不会为你写的,但你基本上只需要添加支票!JavaKeywords.isKeyword(className).
编辑2:当然,如果您还要强制执行普遍接受的编码标准,您可以确保类名以大写字母开头,其中包含:
return Character.isUpperCase(className.charAt(0));
Run Code Online (Sandbox Code Playgroud)
编辑3:正如Ted Hopp指出的那样,即使包含java关键字也会使类名无效,并且在我的某个生产应用程序中使用了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()
Run Code Online (Sandbox Code Playgroud)
我使用了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;
}
Run Code Online (Sandbox Code Playgroud)
呀呀——
Class.forName(String className);
Run Code Online (Sandbox Code Playgroud)
它返回与具有给定字符串名称的类或接口关联的 Class 对象。并抛出Exceptions
LinkageError - if the linkage fails
ExceptionInInitializerError - if the initialization provoked by this method fails
ClassNotFoundException - if the class cannot be located
Run Code Online (Sandbox Code Playgroud)