可以使用Java对Method对象进行序列化?
当我尝试序列化Method对象时,出现此错误。可以使用Java对Method对象进行序列化?
java.io.NotSerializableException: java.lang.reflect.Method
任何想法?
无法以便携方式序列化方法对象,因为它不包含恢复它的所有必需信息(例如字节码)。
相反,您应该序列化类的名称,方法名称和参数类型。然后您可以在反序列化过程中重新创建Method
实例。
我用于解决此问题的解决方案:D – 2009-11-20 11:59:06
java.lang.reflect.Method
不执行java.io.Serializable
。所以它不能使用内置的Java方法进行序列化。
如何查看在java api上实现了哪些类。 – 2009-11-20 11:36:12
@MarcosRorizJunior在mlk链接到的Javadoc中,有一段说明如(用于Method),“**所有已实现的接口:** AnnotatedElement,GenericDeclaration,Member”。这些是类实现的接口。 – 2013-11-05 02:21:21
您可以手动完成。只需将您的类名,方法名和参数类名作为字符串序列化,然后在反序列化过程中使用反射机制重新创建Method对象。
Class.forName(clsName).getMethod("methodName", Class.forName(param1ClsName), ....);
如果实现Externalizable接口,那么你可以使用你的类作为常规序列化类。
如果任何方法参数是基本类型(即int),这不起作用 – luke 2013-06-06 19:35:39
假设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;
}
}
urgh ...你为什么要这么做? – skaffman 2009-11-20 11:23:51
你不应该试图序列化一个方法,因为它只是一个方法信息的句柄,它不是方法本身。你想做什么? – 2009-11-20 23:02:29