0

我使用URLClassLoader從jarfile加載類,然後序列化這些類的對象並將其保存在文件中。然後,當我去反序列化類ObjectInputStream拋出一個java.lang.ClassNotFoundException,並沒有找到我已經動態加載的類。我將如何反序列化加載的類?反序列化動態加載的類java

+1

您需要反序列化中,知道如何找到這些類上下文的類。 –

+0

我該怎麼做?我已經查看了ObjectInputStream的文檔,但是我找不到那樣的東西。 – Ozaren

回答

3

要使用自定義ClassLoader,您必須重寫resolveClass方法。下面是從JDK源爲例(這是不公開,但你可以用它爲靈感)

/** 
* This subclass of ObjectInputStream delegates loading of classes to 
* an existing ClassLoader. 
*/ 

class ObjectInputStreamWithLoader extends ObjectInputStream 
{ 
    private ClassLoader loader; 

    /** 
    * Loader must be non-null; 
    */ 

    public ObjectInputStreamWithLoader(InputStream in, ClassLoader loader) 
      throws IOException, StreamCorruptedException { 

     super(in); 
     if (loader == null) { 
      throw new IllegalArgumentException("Illegal null argument to ObjectInputStreamWithLoader"); 
     } 
     this.loader = loader; 
    } 

    /** 
    * Use the given ClassLoader rather than using the system class 
    */ 
    @SuppressWarnings("rawtypes") 
    protected Class resolveClass(ObjectStreamClass classDesc) 
     throws IOException, ClassNotFoundException { 

     String cname = classDesc.getName(); 
     return ClassFinder.resolveClass(cname, this.loader); 
    } 
} 
+1

感謝,這正是我需要的,我用這個基本骨架和修改決心類方法有「返回的Class.forName(classDesc.getName(),假的,裝載機);」它很好地工作,謝謝! – Ozaren