Czy istnieje metoda w języku Java, aby sprawdzić, czy łańcuch może być używany jako nazwa klasy?Jak sprawdzić, czy nazwa klasy jest poprawna?
Odpowiedz
Yap -
Class.forName(String className);
Zwraca obiekt klasy powiązanych z klasy lub interfejsu z danej nazwy strun. i rzuca Exceptions
LinkageError - if the linkage fails
ExceptionInInitializerError - if the initialization provoked by this method fails
ClassNotFoundException - if the class cannot be located
Sprawdza, czy klasa istnieje, a nie czy ciąg jest zgodny z prawem do użycia jako nazwa klasy (o czym OP chce wiedzieć). –
@ Ted Właśnie podałem informacje i myślę, że byłoby wystarczająco dużo informacji, aby funkcja taka jak sugerował MrLore. –
Nie mogę się zgodzić. OP chce wiedzieć, czy nazwa będzie ważna jako nazwa klasy, a nie czy klasa istnieje. Problem z twoją sugestią jest taki, że rzuci ten sam "ClassNotFoundException" dla legalnych nazw, takich jak "foo.bar" (jeśli klasa nie istnieje) i dla nielegalnych nazw takich jak '"! =? "'. –
Po prostu metodą Class.forName(String name)
, które mogą być używane do testowania to w następujący sposób:
public static boolean classExists(String className)
{
try
{
Class.forName(className);
return true;
}
catch(ClassNotFoundException ex)
{
return false;
}
}
EDIT: Jeśli, jak dashrb mówi, prosisz dla sposób, aby określić, czy String może być użyty jako nazwa klasy (a nie wtedy, gdy już istnieje klasa o tej nazwie), wtedy potrzebna jest kombinacja metody, którą napisałem powyżej (z odwróconymi bajtami, jak możesz " t ponownego użycia nazw klas) oraz w połączeniu z sprawdzeniem, czy ciąg jest słowem kluczowym zarezerwowanym dla środowiska Java. Ostatnio miałem podobny problem i stworzyłem dla niego klasę narzędziową, którą można znaleźć here. Nie napiszę tego dla ciebie, ale po prostu musisz dodać czek na !JavaKeywords.isKeyword(className)
.
Edit 2: I oczywiście, jeśli chcesz również egzekwować ogólnie przyjętych standardów kodowania, można po prostu upewnij się, że nazwa klasy rozpoczyna się wielką literą z:
return Character.isUpperCase(className.charAt(0));
edit 3: Jak wskazuje Ted Hopp, nawet zawierające słowo kluczowe java unieważnia nazwę klasy, a ponieważ Java-Słowa kluczowe jest używane w jednej z moich aplikacji produkcyjnych, stworzyłem updated version, który zawiera metodę containsKeyword(String toCheck)
, która również sprawdzi tę ewentualność. Metoda jest następująca (należy pamiętać trzeba listę słów kluczowych w klasie też):
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()
Twój wpis edycji jest potrzebną odpowiedzią. Dziękuję Ci! – Maxii
Nie musisz mieć pierwszej litery, aby być kapitałem. – tcb
@ tcb Wiem, ale normalną praktyką jest, że klasy zaczynają się od dużej litery, co do której jestem pewien, że każda klasa nie-prymitywna w wbudowanych pakietach działa. – MrLore
użyłem listę słów kluczowych java uprzejmie oferowanych przez MrLore.
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;
}
To nie będzie działać poprawnie z takimi nazwami jak "com.example.true" (co jest niedozwoloną nazwą, ponieważ jeden _komponent_ nazwy jest słowem kluczowym) .Zauważ, że test musi również zezwalać na takie nazwy, jak "com.example". .true_fact "'. –
@ Ted Hopp naprawiony, dziękuję – tcb
Nie do końca poprawiony, nadal będzie pozwalał na nazwy takie jak "com.example.true" '. –
SourceVersion.isName
może być używany do sprawdzania w pełni kwalifikowanych nazw.
Jeżeli nie .
s powinno być dozwolone, kontrola może być wykonane w ten sposób:
boolean isValidName (String className) {
return SourceVersion.isIdentifier(className) && !SourceVersion.isKeyword(className);
}
Spóźniłeś się trzy lata impreza, ale to jest właśnie droga. – mwoodman
- 1. Java - Jak sprawdzić, czy nazwa pliku jest poprawna?
- 2. Jak sprawdzić, czy ścieżka jest poprawna w systemie boost :: filesystem?
- 3. Jak szybko sprawdzić, czy ścieżka x jest poprawna w IE?
- 4. Sprawdź nazwę pliku jest poprawna nazwa systemu Windows
- 5. Jak sprawdzić, czy istnieje nazwa domeny?
- 6. Jak sprawdzić, czy nazwa domeny jest rekordem CNAME w PHP
- 7. Jak mogę sprawdzić, czy podana jest nazwa użytkownika?
- 8. Co to jest poprawna nazwa bazy danych PostgreSQL?
- 9. MongoDB mongorestore failure: locale :: facet :: _ S_create_c_locale nazwa nie jest poprawna
- 10. Czy to jest poprawna implementacja quicksort?
- 11. Jak sprawdzić, czy obiekt jest wystąpieniem konkretnej klasy w D?
- 12. java - Jak sprawdzić, czy mój obiekt jest typu danej klasy?
- 13. Czy ta pełna implementacja dodatku jest poprawna?
- 14. Czy ta konwersja endianizmu jest poprawna?
- 15. Czy tabela html w tabeli jest poprawna?
- 16. Sprawdzanie, czy nazwa domeny jest zarejestrowana.
- 17. Jak sprawdzić, czy jest konsola?
- 18. Jak sprawdzić, czy obiekt jest zerowy?
- 19. Jak sprawdzić, czy java.lang.reflect.Type jest Enum
- 20. Błąd: kwalifikowana nazwa klasy jest niedozwolona
- 21. jak sprawdzić, czy hudson jest zajęty, czy nie?
- 22. Zastosowanie stałej jak nazwa klasy
- 23. Czy nazwa kontrolera pochodzi od nazwy klasy?
- 24. Jak sprawdzić, czy nazwa pliku zawiera podciąg w C#
- 25. metodę rozszerzenia, aby sprawdzić, czy obiekt jest sub klasy T
- 26. Jak sprawdzić, czy nazwa pliku pasuje do wzorca wieloznacznego?
- 27. Jak sprawdzić właściwość obiektu, jeśli nazwa właściwości jest pustym ciągiem?
- 28. Jak sprawdzić, czy zdalny system jest osiągalny?
- 29. Poprawna składnia dla iteratora odwzorowania klasy wewnętrznej klasy szablonu?
- 30. jquery nazwa klasy zmiana
możliwe duplikat [wyrażenie regularne pasujące pełni wykwalifikowanych klas Java] (http://stackoverflow.com/questions/5205339/regular-expression-matching-fully-qualified-java-classes) –
Pyta, czy nazwa ma być prawną nazwą, a nie czy klasa faktycznie istnieje. (Myślę) – dashrb
tak chcę utworzyć nową klasę z odbiciem i nazwą ... więc muszę sprawdzić, czy nazwa jest poprawna – Maxii