1

주어진 유형의 클래스 경로에있는 모든 클래스를 인스턴스화하고 매핑하려고합니다.자바에서 동적으로로드 된 클래스의 .class 파일에 대한 경로 얻기

Reflections 라이브러리를 사용하여 스캔을 수행했으며로드 된 클래스 목록을 받았습니다.

그런 다음 매핑 할 때 충돌이 있는지 확인하고 있습니다 (키는 간단한 클래스 이름 임).

그런 상황이 발생하면 충돌 클래스의 정규화 된 이름과로드 된 경로 (예 : JARs 개가 각각을 찾을 수 있음)를 지적하고 예외를 던지고 싶습니다.

내가, 내가 ... 그 경로를 얻기의 어떤 방법이 있는지 궁금 일뿐만 아니라 메모리에서 클래스를로드 할 수 있습니다 실현,하지만 난 디스크에 JAR에서로드 된 가정

아래

참조 코드 :

if (isConflictingFactoryRegistered(key, myFactory)) { 
     Class<? extends MyFactory> class1 = factoryMap.get(key).getClass(); 
     Class<? extends MyFactory> class2 = myFactory.getClass(); 
     try { 
      throw new RuntimeException("Found two conflicting factories for " + key 
        + ": 1. " + class1 + " in " + getClass().getResource(class1.getSimpleName()+".class").toURI() + 
         " 2. " + class2 + " in " + getClass().getResource(class2.getSimpleName()+".class").toURI()); 
     } catch (URISyntaxException e) { 
      throw new RuntimeException(e); 
     } 
    } else { 
     factoryMap.put(myFactory.getName(), myFactory); 
    } 

이 코드는 컴파일되지만 작동하지 않습니다. getClass(). getResource (class1.getSimpleName() + ". class")는 null을 리턴합니다. .class의 경로는 어떻게 얻을 수 있습니까?

답변

1

난 당신이

throw new RuntimeException("Found two conflicting factories for " + key 
    + ": 1. " + class1 + " in " + class1.getResource(class1.getSimpleName()+".class").toURI() + 
" 2. " + class2 + " in " + class2.getResource(class2.getSimpleName()+".class").toURI()); 

이 내 컴퓨터에 임의의 두 클래스 작동과

throw new RuntimeException("Found two conflicting factories for " + key 
    + ": 1. " + class1 + " in " + getClass().getResource(class1.getSimpleName()+".class").toURI() + 
    " 2. " + class2 + " in " + getClass().getResource(class2.getSimpleName()+".class").toURI()); 

를 교체하는 것이 좋습니다. , the API에 따라이 객체의 클래스 로더에

이 방법 위임을 - 일반적으로

, 나는 Class.getResource()는 특정 클래스를로드 같은 클래스 로더에 사용할 수있는 리소스를 찾을 수 있다고 생각합니다. 이 객체가 bootstrap 클래스 로더에 의해로드되었을 경우,이 메소드는 ClassLoader.getSystemResource (java.lang.String)에 위양합니다.

예에서 getClass().getClassLoader()class1.getClassLoader()을 보면 다른 것으로 생각할 수 있습니다.

+0

그럴듯한 순간 .. 그랬어. 감사합니다. – ronif

+0

문제 없습니다. 도와 드리겠습니다. 그것이 도움이 되었다면 upvote에 자유롭게 느껴라 :) –