가져 오기하지 않고 컴파일 단위에서 참조 할 수있는 JRE 클래스를 프로그래밍 방식으로 알아야합니다 (정적 코드 분석 용). 우리는 패키지 로컬 클래스를 무시할 수 있습니다. According to the JLS, 패키지 java.lang
의 클래스가 암시 적으로 임포트됩니다. 출력은 binary class names의 목록이어야합니다. 이 솔루션은 일반 Java 5 이상 (Guava 없음, Reflections 등)으로 작동하며 벤더에 무관심해야합니다.가져올 필요가없는 JRE 클래스 목록을 프로그래밍 방식으로 결정하십시오.
신뢰할 수있는 Java 기반 솔루션입니다. 여기
내가 지금까지 시도했습니다 무엇에 대한 몇 가지주의 사항은 다음과 같습니다
언뜻 보면, 질문 인 "? 어떻게 패키지의 모든 클래스를로드하기"로 요약 할 것 같다 물론 실질적으로 불가능합니다. 몇 가지 해결 방법이 있습니다 (예 : this 및 this 및 여기에 링크 된 블로그 게시물). 하지만 제 경우는 여러 클래스 로더 문제가 존재하지 않기 때문에 훨씬 간단합니다. java.lang
stuff는 항상 system/bootstrap 클래스 로더에서로드 할 수 있으며 해당 패키지에 고유 한 클래스를 만들 수 없습니다. 문제는 시스템 클래스 로더가 링크 된 appoaches가 의존하는 클래스 경로를 누설하지 않는다는 것입니다.
지금까지, 나는 핫스팟 VM에 내가 사용하기 때문에 대표단 java.lang.Object
을로드 할 수 있습니다, Object.class.getClassLoader()
반환 null
및 Thread.currentThread().getContextClassLoader()
을 시스템 클래스 로더의 클래스 경로에 액세스하려면 관리하지 않은,하지만 자체는 포함되지 않습니다 classpath. this one과 같은 솔루션은 저에게 적합하지 않습니다. 또한 list of guaranteed system properties에는 이러한 유형의 클래스 경로 정보 (예 : sun.boot.class.path
)가 포함되지 않습니다.
rt.jar이 전혀 없다고 가정하고 시스템 클래스 로더가 사용하는 리소스 목록을 스캔하면 좋을 것입니다. 이러한 접근 방식은 벤더 특정 JRE 구현과 관련하여보다 안전합니다.
귀하가 참조하는 JLS 단락에서 해당 패키지가 "관찰 가능"하지만 암시 적으로 수입된다는 의미는 아닙니다. 7.3 절은 항상 암시적인'import java.lang. *;'이라는 것을 말합니다. – Jesper
@Jesper 감사합니다. 당신 말이 맞습니다. 그것은 내가 경험적으로 관찰 한 것입니다. 그에 따라 질문을 업데이트했습니다. –
패키지 로컬 클래스를 잊어 버리지 않았습니까? –