2014-11-02 2 views
2

런타임 중에 jar 파일에서 클래스를 동적으로로드하고로드 할 패키지의 이름을 알 수있는 방법을 알아 내려고 노력했습니다. 나는 이것을 시도했다 : How to get all classes names in a package? 그것은 작동하지 않았다. 나는 나중에 jar 파일 밖의 프로그램을위한 것이라는 것을 깨달았다.Jar 파일에서 동적 클래스로드

Class<?>[] cls = loader.loadPackage("com.example.core"); 

처럼, 내가 정의 된 패키지의 모든 클래스를로드 할 수있는 방법을 볼 수 없습니다

URL[] urls = .... 
URLClassLoader loader = new URLClassLoader(urls); 
Class<?> cls = loader.loadClass("com.example.core.Main"); 
Module module = (Module) cls.newInstance(); 

그러나 : 나는 또한 내가 더 많이 좋아하는 또 다른 질문에서이 코드 조각을했다 이게 어떻게 가장 잘 해결됩니까? 나는 아주 조금 연구했고 나는 아마도 잘못된 방향으로 가고 있다고 생각했다. 궁극적으로는 패키지 이름 만 알지 못하고 패키지의 모든 클래스를로드하는 것이 더 간편한 "클래스 삭제"편집 방법입니다.

+1

왜 특정 패키지의 모든 클래스를 맹목적으로로드하려고합니까? 어쨌든 정규화 된 클래스 이름을 아는 경우가 아니면 사용할 수 없습니다. –

+0

객체를 객체로로드하고 할당 된 ID가있는 목록에 객체를 저장하는 또 다른 클래스가 있으며 코드를 실행하는 실제 클래스보다는 "정의"로 사용됩니다. 편집 : 그들은 또한 모두 같은 클래스를 확장, 그래서 그들은 내게 유용합니다. – Mad3ngineer

+0

"코드를 실행하는 실제 클래스가 아닌 ...". 클래스를 사용하여 코드를 실행하지 않으려는 경우 클래스가 필요하지 않습니다. 원하는 효과를 얻는 방법은 거의 확실합니다. –

답변

0

이 다음과 같이 기술적으로 가능 : 그대로

private List<Class<?>> loadClassesInPackage(String packageName) { 

    ClassLoader loader = getClassLoader(); 
    List<Class<?>> list = new ArrayList<Class<?>>(); 
    // com\.package\.subpackage(?!.*\$).* 
    String regex = Pattern.quote(packageName) + "(?!.*\\$).*"; 

    try { 
     DexFile df = new DexFile(getPackageCodePath()); 
     for (Enumeration<String> e = df.entries(); e.hasMoreElements();) { 
      String s = e.nextElement(); 

      if (s.matches(regex)) { 
       Log.d(TAG, "match: " + s); 

       list.add(loader.loadClass(s)); 
      } 

     } 
    } catch (Exception e) { 
     Log.w(TAG, "exception while building class list", e); 
    } 

    return list; 
} 

그것은 내부/익명 클래스를 제외합니다. 또한 기본 생성자, 추상 클래스가없는 클래스를로드하는 것과 같은 많은주의 사항이 있습니다. 이는 라이브러리 참조를 포함하여 앱의 APK에있는 모든 클래스에서 작동해야합니다.

+0

감사합니다. 이게 내가 필요한거야. – Mad3ngineer