2012-04-26 3 views
3

Java의 Class.forName ("")을 사용하여 클래스 중 하나를로드해야합니다. 문제는 클래스 이름 만 지정하고 클래스 이름을 지정하지 않아도 클래스를로드해야한다는 것입니다.클래스 이름 만 사용하여 클래스를로드하는 방법

이 작동하지만 내 요구 사항에 맞지 않는 예를 들어
  1. :

    가 Class.forName ("reflection.Person을");

  2. 그리고 이것은 내가 필요하지만 작동하지 않습니다 :

    가 Class.forName ("사람");

누구나 # 2 작동 방법을 알고 있습니까? 난 그냥 간단한 클래스 이름을 사용해야합니다. 클래스가 존재하는지 확인하기 위해 내 폴더 구조를 살펴볼 수있는 타사 도구가 있습니까? 이것은 실행 가능한 JAR로 배포됩니다.

미리 감사드립니다.

+2

thirdpckg.Person, fourthpckg.Person 등의 클래스가 있다면 어떻게 될까요? 이름없는 패키지에 Person 클래스가 있으면 어떻게 될까요? – emory

+0

전체 클래스 경로 (본질적으로 디렉토리 및 jar 파일의 목록)를 스캔하고 클래스와 같은 파일을 찾습니다. 그런 다음 경로 이름에서 패키지 이름을가집니다. 하지만 일치하는 많은 파일로 끝날 수도 있습니다. – 9000

+0

중복 된 클래스 이름은 허용하지 않습니다. 이들은 단지 고유 한 클래스 이름이 될 것입니다. – Marquinio

답변

4

당신은 get all classes on the classpath을 반복해야하며 원하는 이름과 동일한 간단한 이름을 가진 것을 확인하십시오. 그런 다음 Class.forName(..)을 정규화 된 이름으로 지정하십시오. 같은 이름을 여러 패키지에서 사용할 수 있습니다.

look for classes implementing an interface 또는 annotated with a specific annotation입니다. 간단한 이름에 의존하는 것은 정말 까다로울 수 있습니다. 특히 클래스 패스가 커지면 더욱 그렇습니다.

+1

+1 - * "같은 이름을 여러 패키지에서 사용할 수 있습니다."* 따라서 동일한 (간단한) 이름을 가진 여러 클래스가있는 경우를 다루는 전략이 필요합니다. 나는 이것이 좋은 디자인이 아니라는 점을 강하게 동의한다. –

1

"Person"과 같은 클래스 이름의 의미는 소스 코드에서 발생하는 위치에 따라 달라집니다. 자바 컴파일러는 어디서나 완전한 클래스 이름을 요구하지 않는 편이 편리합니다. 그러나 런타임시 바이트 코드에서 모든 클래스 이름은 완전합니다.