可以在Java中序列化Method对象吗?

时间:2009-11-20 11:18:30

标签: java reflection serialization

当我尝试序列化一个Method对象时,我收到此错误。

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

任何想法?

4 个答案:

答案 0 :(得分:6)

您可以手动执行此操作。只需将类名,方法名和参数类名序列化为字符串,然后在反序列化期间使用反射机制重新创建Method对象。

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

如果您实现Externalizable接口,那么您可以将您的类用作常规可序列化类。

答案 1 :(得分:3)

java.lang.reflect.Method未实施java.io.Serializable。因此无法使用内置Java方法进行序列化。

答案 2 :(得分:2)

无法以可移植的方式序列化方法对象,因为它不包含恢复它的所有必要信息(例如,字节码)。

相反,您应该序列化类的名称,方法名称和参数类型。然后,您可以在反序列化期间重新创建Method实例。

答案 3 :(得分:1)

假设java.lang.reflect.Method对象是另一个类的成员,您应该将其标记为瞬态,并在反序列化后使用类名和方法名/签名重新创建它。

您可以为此目的实现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;
   }
}