2012-11-06 82 views
3

我使用了以下內容:反射拋出java.lang.ClassNotFoundException

protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    super.onActivityResult(requestCode, resultCode, data); 
    switch(requestCode){ 
     case EDIT_ADJUSTMENT: 
      if(resultCode == RESULT_OK){ 
       try{ 
        String adjustment = data.getStringExtra("adjustment"); 
        adjustment = adjustment.replace(" ", ""); 
        ClassLoader myClassLoader = ClassLoader.getSystemClassLoader(); 
        String classNameToBeLoaded = "com.picpic.adjustments." + adjustment; 
        Class adjust = myClassLoader.loadClass(classNameToBeLoaded); 
       }catch(Exception e){ 
        String msg = e.getMessage(); 
       } 
      } 
     break; 
    } 
} 

當它到達Class adjust = myClassLoader.loadClass(classNameToBeLoaded);我得到以下異常:java.lang.ClassNotFoundException: com.picpic.adjustments.ColorCorrect

ColorCorrect包是com.picpic.adjustments

所以,爲什麼這個錯誤被拋出?如果您需要更多信息,請告訴我。謝謝!

+0

如果您直接訪問該類,它是否工作,例如, '類c = com.picpic.adjustments.ColorCorrect.class;' - 你確定類是在類路徑上? – DNA

+0

它與執行onActivityResult的活動是否在相同的apk中? – Snicolas

+0

只是一個猜測,但它可能是錯誤的'ClassLoader'爲您的班級 – zapl

回答

3

我猜這是因爲你在無形類的類裝載器通過它,你要加載的類。

我建議你試試this.getClass().getClassLoader()而不是ClassLoader.getSystemClassLoader()

Java有一個ClassLoader Hierarchy。每個Class Loader都有不同的類路徑來從中加載類。由於看起來您要加載的類是用戶定義的類,因此可能對於通過ClassLoader.getSystemClassLoader()方法返回的類加載器不可見。 (您可以嘗試使用Google ClassLoader Hierarchy的搜索功能。如果您以前不知道這一點,可能是這個link很有用)。

0

這是我用來解決該問題的代碼:

protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    super.onActivityResult(requestCode, resultCode, data); 
    switch(requestCode){ 
     case EDIT_ADJUSTMENT: 
      if(resultCode == RESULT_OK){ 
       String adjustment = data.getStringExtra("adjustment"); 
       adjustment = adjustment.replace(" ", ""); 
       try{ 
        ClassLoader myClassLoader = Edit.this.getClass().getClassLoader(); 
        String myPackage = Edit.this.getClass().getPackage().getName(); 
        String classNameToBeLoaded = myPackage + ".adjustments." + adjustment; 
        Class adjust = myClassLoader.loadClass(classNameToBeLoaded); 
        Object whatInstance = adjust.newInstance(); 
        adjust.getMethod("setBitmap", new Class[]{Bitmap.class}).invoke(whatInstance, new Object[]{Edit.this.stage.getImage()}); 
        Bitmap bmp = (Bitmap)adjust.getMethod("applyFilter").invoke(whatInstance); 
        Edit.this.stage.setStageImage(bmp); 
        Edit.this.stage.showTopItems(bmp); 
       }catch(Exception e){ 
        String msg = e.getMessage(); 
       } 
      } 
      break; 
    } 
} 
+0

對不起,有關答案。我是StackOverflow的新手,我發現我的評論正在消失。所以,我也加了一個答案。 – user1700184

相關問題