2009-09-23 9 views
0

예를 들어 이름이;Class.forName을 소문자/대문자로 무시하는 방법

'MonkeyBusiness는'

은 내가 Class.forName을 ("MonkeyBusiness는")를 사용하여 호출 할 수 있습니다 알고;

하지만 Class.forName ("monkeyBusiness")을 사용하여 호출 할 때; 또는 Class.forName ("monkeybusiness"); 그것은 나에게 예외를 준다; 스레드에서

예외 "기본"java.lang.NoClassDefFoundError가 : MonkeyBusiness는
(잘못된 이름 : GMD/NTX/서비스/사용/MonkeyBusiness는)

그것은 어떤 경우 형식 문자열을 사용하여 호출 할 수 있습니까? 그렇다면 어떻게?

+0

@Gerritt가 맞습니다. 유일한 선택은 모든 클래스/패키지의 이름을 모두 대문자 또는 소문자로 지정한 다음 클래스 이름 문자열에 String.toUpperCase() 또는 String.toLowerCase()를 사용하는 것입니다.하지만 이는 거의 모든 Java 코딩 규칙에 위배됩니다. -P –

답변

9

그렇지 않습니다.

원숭이 원숭이와 원숭이는 자바에서 완전히 다른 세 가지입니다.

왜 이러한 기능이 필요합니까? 루트 문제는 응용 프로그램 내에서 어떤 클래스가 관련이 있는지 알지 못하기 때문일 수 있습니다.

다음 두 가지 작업을 수행 할 수 있습니다. 먼저 소문자 또는 CamelCase 클래스 이름 만 사용하는 내부 규칙을 작성하십시오. 이 방법으로 검색을 적절한 형식으로 변환하면됩니다. Class.forName (className.toLowerCase())

둘째, 사용 된 모든 클래스의 캐시를 만들고 캐시에서 적절한 이름을 찾아 볼 수 있습니다. 소문자 이름을 키로 사용하고 실제 이름을 값으로 사용하여 목록을 만드십시오.

셋째, 권장하지는 않지만 무차별 강제로 모든 조합을 확인하십시오. 그러나 이것은 길이가 긴 이름의 경우 매우 나쁜 스케일링 함수를 만듭니다. 길이가 n 인 경우 2^n입니다.

3

대소 문자를 무시하는 ClassLoader를 작성할 수 있습니다. Java ClassLoader는 기본적으로 하나의 함수 만 지원합니다. 클라이언트는 "여기에 문자열이 있습니다. 그 이름으로 클래스를로드하십시오."라고 말할 수 있으며 ClassLoader는 "죄송합니다. 클래스를 모른다"또는 "예, 여기 있습니다. 수업". ClassLoader가이 동작을 구현하는 방법은 구현 자까지 완료됩니다.

+0

커스텀 ClassLoader의 예가 있습니까? – Thys

+0

http://www.google.de/search?q=java+"custom+classloader"+tutorial –

관련 문제