Java序列化方法

可以序列化方法吗? 因为当我查看文档时,Method类不实现Serializable。 那么还有其他选择吗?

由于Method未实现Serializable,因此无法使用标准Java Serialization API对其进行序列化。

解决方法是手动序列化类和方法的名称及其参数类型。 然后,您可以在反序列化期间重新创建Method实例。

这取决于你的意思。 真的,正如人们已经提到的方法无法序列化。 但是,如果您希望序列化方法实现的逻辑并(例如)通过网络发送它,则可能。 这种序列化可以通过序列化类本身来完成。 实际上.class已经是一个可以存储(并且通常存储)在文件中的字节序列。 您可以根据需要通过网络发送它,然后使用Class.forName()进行实例化。 此外,您可以做得更好:使用HttpClassLoader,将您的类可用的HTTP URL传递给它,使用此类加载器创建类实例并运行您想要的任何方法。

您可以使用以下包装器来允许方法序列化:

public class SerializableMethod implements Serializable { private static final long serialVersionUID = 6631604036553063657L; private Method method; public SerializableMethod(Method method) { this.method = method; } public Method getMethod() { return method; } private void writeObject(ObjectOutputStream out) throws IOException { out.writeObject(method.getDeclaringClass()); out.writeUTF(method.getName()); out.writeObject(method.getParameterTypes()); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { Class declaringClass = (Class)in.readObject(); String methodName = in.readUTF(); Class[] parameterTypes = (Class[])in.readObject(); try { method = declaringClass.getMethod(methodName, parameterTypes); } catch (Exception e) { throw new IOException(String.format("Error occurred resolving deserialized method '%s.%s'", declaringClass.getSimpleName(), methodName), e); } } } 

如果你只是想知道,是否可能,而不是:它没有实现Serializable 。 此外, Method是一个final类,因此您不能将其子类化以添加某些function。

实际上,所有方法都是其类的一部分,而Class 确实实现了Serializable。 因为无论如何你都需要类的对象来调用方法,你可以发送类(或对象)。

但是,在接收方,通常会在那里创建一个类的版本的对象。

如果你想使用它在远程端调用你的方法,看看RMI(包java.rmi.* ) – 当远程端(还)没有类数据时,它还支持发送对象。

Thought Works库xStream做得非常好。 这是一个两分钟的教程 。

Python确实允许挑选顶级方法,在Java中调用另一个主机上的方法的方法是通过某种RMI机制。 类字节码可以通过线路发送,并且满足所有依赖性 – 使用URLClassloader执行此操作。