2015-05-07 63 views
0

我有一個類文件和該類的保存對象。我的Java應用程序在其庫中沒有該類。當我嘗試使用ObjectInputStream加載對象時,它給出ClassNotFoundException在java中動態加載一個類及其對象

然後我使用下面的代碼。

URLClassLoader classLoader = new URLClassLoader(new URL[]{classFile.getParentFile().toURI().toURL()}); 
classLoader.loadClass(classFile.getName().replace(".class", "")).newInstance(); 
myClass= (MyClass) FileIOManager.readObject(classObj); 

但是這段代碼在讀取對象時也給了我同樣的異常。希望能幫助我完成任務..

MyClass沒有包名稱。

FileIOManager.readObject()是我創建的一個方法來讀取一個對象,它對我的​​庫中有類的其他對象工作正常。

+0

Yon需要提供該類的全限定名稱,包括該包。否則,你會得到這個例外。 – Turing85

+0

該類未創建包名稱。我認爲那不是問題.. –

+0

你確定你的ObjectInputStream使用你的類加載器嗎? OIS傾向於忽略當前的Thread類加載器並使用系統類加載器。請確認。 – SirRichie

回答

0

FileIOManager類,我創建了以下..

public static Serializable readObject(String path) throws FileNotFoundException, IOException, ClassNotFoundException { 
    return readObject(path, null); 
} 

public static Serializable readObject(String path, final ClassLoader classLoader) throws FileNotFoundException, IOException, ClassNotFoundException { 
    Serializable obj; 
    try (FileInputStream fis = new FileInputStream(path); ObjectInputStream ois = new ObjectInputStream(fis) { 

     @Override 
     protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { 
      if (classLoader == null) { 
       return super.resolveClass(desc); 
      } 
      return Class.forName(desc.getName(), false, classLoader); 
     } 

    }) { 
     obj = (Serializable) ois.readObject(); 
    } 
    return obj; 
} 

這裏path是路徑類文件改變了readObject()方法。

並獲取對象如下。

URLClassLoader classLoader = new URLClassLoader(new URL[]{classFile.getParentFile().toURI().toURL()}); 
myClass = (MyClass) FileIOManager.readObject(loc, classLoader);