2012-06-05 56 views
0

我做了一個小應用程序,從一個文件夾中加載類,將它們顯示在一個列表中,當你點擊一個時,它會在其中顯示JPanel如何使用Java加載插件類?

所以我做了一個API類(BaseApp),它擴展了JPanel。我還做了一個測試課,其中包含extends BaseApp並使用其中的API。

現在,我的問題是,每次我點擊TestApp,它給了我這個Exception ...

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Class  cannot be cast to me.Delocaz.SuperApp.BaseApp 
at me.Delocaz.SuperApp.AppSelect$2.mouseClicked(AppSelect.java:76) 
at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$000(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 

我試圖從我的類加載器鑄Class我陷入了BaseApp。我沒有崩潰怎麼辦?

如果你需要它,這是我FileClassLoader

package me.Delocaz.SuperApp; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
public class FileClassLoader extends ClassLoader { 
    public Class<?> findClass(File f) { 
     byte[] b = loadClassData(f); 
     try { 
     return defineClass(null, b, 0, b.length); 
     } catch (ClassFormatError ex) { 
     return null; 
     } 
    } 
    private byte[] loadClassData(File f) { 
     FileInputStream fin; 
     byte fileContent[] = new byte[(int)f.length()]; 
     try { 
      fin = new FileInputStream(f); 
      fin.read(fileContent); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return fileContent; 
    } 
} 

而且,這其中,鑄發生:

Object c = cl.findClass(new File(***CLASS FILE LOCATION***)); 
System.out.println(c); 
switchApp((BaseApp) c); 

回答

2

Class類型的實例是不BaseApp類型的實例,那麼轉換失敗。您需要實例化類來獲得BaseClass類型,然後你就可以施放

試穿類實例調用newInstance()得到加載的類的新實例的實例(根據其默認的構造函數)

+0

謝謝! (我如何回覆?) – user1438098

+0

您的評論_is_ a reply。如果它幫助你解決問題,請接受答案 – Attila