Java에서 패키지 이름을 포함한 현재 클래스 이름을 얻는 방법은 무엇입니까?


82

저는 프로젝트에서 작업 중이며 한 가지 요구 사항은 main 메서드의 두 번째 인수가 " /"(리눅스의 경우)로 시작하는 경우 절대 경로 (문제가 아님)로 간주해야하지만 "로 시작하지 않는 경우"입니다. /”, 클래스 의 현재 작업 경로 를 가져 와서 주어진 인수에 추가해야합니다.

System.getProperty("java.class.path"), new File(".")getCanonicalPath()등 여러 가지 방법으로 클래스 이름을 가져올 수 있습니다 .

문제는 패키지가 저장된 디렉토리 만 제공한다는 것입니다. 즉 .../project/this/is/package/name, " "에 저장된 클래스가있는 경우 " "만 제공 /project/하고 실제 존재하는 패키지 이름은 무시합니다 .class files.

어떤 제안?

편집 : 여기에 운동 설명에서 가져온 설명이 있습니다.

sourcedir은 절대적 ( "/"로 시작)이거나 프로그램을 실행하는 위치에 상대적 일 수 있습니다.

sourcedir은 main 메소드에 대해 주어진 인수입니다. 그 길을 어떻게 찾을 수 있습니까?


2
코드가 JAR로 패키징 된 경우 (또는 가정하는 것과 같은 폴더 / 파일 구조에없는 경우) 어떻게 하시겠습니까? 위험한 가정입니다. 이것은 작은 실험, 클래스 할당 또는 기타 일회용 상황에서는 잘 작동 할 수 있지만 프로덕션 품질 코드에 대해 이러한 가정을하는 습관을 갖지 마십시오.
E-Riz 2012 년

클래스 파일에 대한 경로를 찾는 의미가 없습니다. 또한 연습 설명에는주의 깊게 읽으면 언급하지 않습니다 ( 프로그램을 실행하는 위치 는 사용자가 프로그램을 호출 한 현재 경로를 의미 함).
The Nail

요구 사항을 더 잘 이해하도록 도와 주시겠습니까? 인수가 '/'(설명에 언급)로 시작하는지 확인해야합니다. 그렇다면 절대적으로 사용하십시오. 그대로. 하지만 그렇지 않은 경우 어떻게 처리해야합니까?
La bla bla

답변:


166

this.getClass().getCanonicalName()전체 클래스 이름을 가져 오는 데 사용 합니다.

패키지 / 클래스 이름 ( "abC")은 .class 파일 (a / b / C.class)의 경로와 다르며 패키지 이름 / 클래스 이름을 사용하여 경로를 파생하는 것은 일반적으로 좋지 않습니다. 클래스 파일 / 패키지 세트는 여러 다른 클래스 경로에있을 수 있으며 디렉토리 또는 jar 파일 일 수 있습니다.


감사합니다.하지만 메인 메소드에 있으며 정적 메소드에서는 'this'를 사용할 수 없습니다. 해결 방법이 있습니까?
La bla bla


30

Class작업을 수행 할 수 있는 클래스 가 있습니다.

Class c = Class.forName("MyClass"); // if you want to specify a class
Class c = this.getClass();          // if you want to use the current class

System.out.println("Package: "+c.getPackage()+"\nClass: "+c.getSimpleName()+"\nFull Identifier: "+c.getName());

패키지 c의 클래스 MyClass를 나타내는 경우 mypackage위 코드는 다음을 인쇄합니다.

패키지 : mypackage
클래스 : MyClass
전체 식별자 : mypackage.MyClass

이 정보를 가져와 필요에 따라 수정하거나 API 에서 자세한 정보를 확인할 수 있습니다.


1
Class.forName ( "MyClass")는 기본 패키지에있는 경우에만 작동합니다 (즉, 패키지 선언이 없음).
The Nail

2
@TheNail true, getName()패키지 이름과 클래스 이름을 반환하여 지금 편집합니다.
Jon Egeland

getSimpleName()패키지 이름없이 클래스 이름 만 가져 오는 데 사용 합니다.
The Nail

1
다른 이유로 런타임 검색이 실제로 필요한 경우가 아니면 대신 Class.forName("MyClass")사용해야합니다 MyClass.class.
mjaggard

12

정규화 된 이름은 다음과 같이 획득됩니다.

String fqn = YourClass.class.getName();

하지만 클래스 경로 리소스를 읽어야합니다. 그래서 사용

InputStream in = YourClass.getResourceAsStream("resource.txt");

3

사용 this.getClass().getName()얻기 위해 packageName.className사용은 this.getClass().getSimpleName()단지 클래스 이름을 얻기 위해

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.