2009-11-20 117 views
2

當我嘗試序列化Method對象時,出現此錯誤。可以使用Java對Method對象進行序列化?

java.io.NotSerializableException: java.lang.reflect.Method 

任何想法?

+0

urgh ...你爲什麼要這麼做? – skaffman 2009-11-20 11:23:51

+0

你不應該試圖序列化一個方法,因爲它只是一個方法信息的句柄,它不是方法本身。你想做什麼? – 2009-11-20 23:02:29

回答

2

無法以便攜方式序列化方法對象,因爲它不包含恢復它的所有必需信息(例如字節碼)。

相反,您應該序列化類的名稱,方法名稱和參數類型。然後您可以在反序列化過程中重新創建Method實例。

+0

我用於解決此問題的解決方案:D – 2009-11-20 11:59:06

3

java.lang.reflect.Method不執行java.io.Serializable。所以它不能使用內置的Java方法進行序列化。

+1

如何查看在java api上實現了哪些類。 – 2009-11-20 11:36:12

+1

@MarcosRorizJunior在mlk鏈接到的Javadoc中,有一段說明如(用於Method),「**所有已實現的接口:** AnnotatedElement,GenericDeclaration,Member」。這些是類實現的接口。 – 2013-11-05 02:21:21

6

您可以手動完成。只需將您的類名,方法名和參數類名作爲字符串序列化,然後在反序列化過程中使用反射機制重新創建Method對象。

Class.forName(clsName).getMethod("methodName", Class.forName(param1ClsName), ....); 

如果實現Externalizable接口,那麼你可以使用你的類作爲常規序列化類。

+0

如果任何方法參數是基本類型(即int),這不起作用 – luke 2013-06-06 19:35:39

1

假設java.lang.reflect.Method對象是另一個類的成員,則應將其標記爲transient,並在反序列化後使用類名稱和方法名稱/簽名重新創建它。

您可以爲此實現一個MethodInfo類。

class SerializableClass { 
    private transient Method m_method; //Not serialized 
    private MethodInfo m_methodInfo; 

    public Method getMethod() { 
     if(m_method != null) { 
      //Initailize m_method, based on m_methodInfo 
     } 

     return m_method; 
    } 
} 
相關問題