클래스가로드되지 않은 경우에도 클래스 로더가 패키지를로드하도록 강요하는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/1816730

문제

Java Codebase에 "com.example"이라는 패키지가 있다고 가정 해 봅시다.

런타임에 전화 하여이 패키지를 얻을 수 있습니다.

Package p = Package.getPackage( "com.example" ); //(returns null)

또는 전화하여 모든 패키지 목록을 받으십시오.

Packages[] ps = Package.getPackages();

문제는 - 클래스 로더가 아직 패키지에서 클래스를로드하지 않은 경우 이러한 기능 호출에 사용할 수 없습니다. 패키지의 클래스 중 하나를 먼저 강제로로드하여 다음과 같이 패키지를로드하도록 강요 할 수 있습니다.

this.getClass().getClassLoader().loadClass( "com.example.SomeClass" );
Package p = Package.getPackage( "com.example" ); //(returns non-null)

그러나 이것은 해킹이며 패키지에 속하는 일부 클래스의 이름을 미리 알아야합니다.

문제는 클래스 로더가 무엇이든했는지 여부에 관계없이 이름으로 패키지 인스턴스를 얻는 방법이 있습니까? 이 상황에서 클래스로드/패키지가 어떻게 작동하는지에 대한 나의 가정이 정확합니까?

도움이 되었습니까?

해결책

주석을 검사해야하기 때문에이 문제가 필요하다고 생각합니다. 그렇지 않으면 작업 만 주석에 액세스하는 패키지 참조에 관심이 없습니다. 이로 인해 일부 주석이있는 패키지 info.java가 정의 된 것으로 가정됩니다.

확인하면 java.lang.Package 당신은 그것을 볼 것입니다 getPackageInfo 패키지 -INFO 클래스를 일반 클래스로로드합니다.

나는 같은 문제가 있었고이 솔루션을 생각해 냈습니다.

public static Package getPackage(String packageName) throws ClassNotFoundException {
    Class.forName(packageName+".package-info"); // makes sure package info exist and that the class loader already knows about the package
    return Package.getPackage(packageName);
}

다른 팁

또는 클래스 루트 디렉토리를 시작점으로 사용하고 모든 *.class 파일 및 서브 디렉토리를 걸어 갈 수 있습니다. 모든 .class 파일이 어디에 있는지 아는 경우에만 작동합니다.

이 모든 것의 원인은 Java가 동적 클래스로드를 가지고 있기 때문에 컴파일 시간 또는 시작 시간에 알려지지 않은 위치에서 런타임에 클래스를로드 할 수 있습니다. 따라서 패키지의 개념은로드 된 클래스의 네임 스페이스 일뿐입니다.

귀하의 가정이 유효하지 않다는 것이 두렵습니다. 클래스 로더는 클래스를로드 할 때 패키지 부기 유지를 수행합니다.

와일드 카드를 전달할 수 있습니다 ClassLoader.getResources 그리고 패키지로 수업을 집어들도록 강요하여 작업을 수행 할 것입니다.

당신은 자신의 클래스 로더를 호출 할 수 있습니다 definePackage, 그러나 그것은 사용중인 일반적인 바닐라 클래스 로더에 도움이되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top