2009-11-20 113 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; 
    } 
} 
相关问题