2010-06-03 3 views
3

Android에서 물건을 시험해보고 있는데 다른 인터페이스의 클래스를 .apk로 캐스팅하려고 할 때 막혔습니다. 그 인터페이스를 구현하는 다른 .apks에 인터페이스와 다양한 클래스가 있습니다. 나는 다른 클래스들을 PackageManager의 질의 메소드를 사용하여 찾고 Application # createPackageContext()를 사용하여 그 컨텍스트에 대한 클래스 로더를 얻는다. 그런 다음 클래스를로드하고 새 인스턴스를 만든 다음 인터페이스로 캐스트하려고 시도합니다.이 인터페이스는 확실히 구현된다는 것을 알고 있습니다.리플렉션을 통해 생성 될 때 인터페이스로 객체 캐스팅

캐스팅을 시도하면 클래스 캐스팅 예외가 발생합니다. 클래스 # asSubclass 등을 사용하여 먼저 인터페이스를로드하는 것과 같은 여러 가지 작업을 시도했지만 어느 것도 작동하지 않았습니다. 클래스 # getInterfaces()는 인터페이스가 구현되었음을 보여줍니다. 내가 어떤 안드로이드 개발을 완료하지 않은

PackageManager pm = getPackageManager(); 
List<ResolveInfo> lr = pm.queryIntentServices(new Intent("com.example.some.action"), 0); 
ArrayList<MyInterface> list = new ArrayList<MyInterface>(); 

for (ResolveInfo r : lr) { 
    try { 
     Context c = getApplication().createPackageContext(r.serviceInfo.packageName, Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE); 
     ClassLoader cl = c.getClassLoader(); 
     String className = r.serviceInfo.name; 
     if (className != null) { 
      try { 
       Class<?> cls = cl.loadClass(className); 
       Object o = cls.newInstance(); 
       if (o instanceof MyInterface) { //fails 
        list.add((MyInterface) o); 
       } 

      } catch (ClassNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } // some exceptions removed for readability 
     } 
    } catch (NameNotFoundException e1) { 
     e1.printStackTrace(); 
    } 
} 

답변

3

, 그렇게하지 않는 나는 그것의 클래스 로더의 뉘앙스 모르겠지만, 일반적으로 자바 프로그래밍, 두 개의 클래스가 다른 클래스 로더에 의해로드 : 내 코드는 다음과 같습니다 같은 & hellip; 동일한 클래스 "파일"에서로드 된 경우에도 마찬가지입니다. 당신이 "당신의"클래스 로더에 인터페이스 X를로드 한 다음 는 "외국"클래스 로더에서 클래스 X을 구현하기 위해를 나타 개체를 얻을 경우

그래서, 캐스트는 "당신의"X는 실패합니다.

작동 시키려면 X이 다른 두 로더의 공통 상위 인 클래스 로더에서로드되어야합니다.

+0

아, 그게 설명해. 감사. –

관련 문제