Методы сериализации Java

Можно ли сериализовать метод? Потому что, когда я смотрю документацию, класс Method не реализует Serializable. Есть ли альтернативы?

Ответы

Ответ 1

Так как метод не реализует Serializable, его нельзя сериализовать, используя стандартный Java Serialization API.

Обходным путем было бы вручную сериализовать только имя класса и метода и его типы параметров. Затем вы можете воссоздать экземпляр Method во время десериализации.

Ответ 2

Это зависит от того, что вы имеете в виду. Действительно, поскольку ребята, упомянутые выше, не могут быть сериализованы. Но если вы хотите сериализовать логику, которую реализует этот метод, и (например) отправить ее по сети, это возможно. Эта сериализация может быть выполнена путем сериализации самого класса. Фактически .class - это уже последовательность байтов, которые могут быть сохранены (и, как правило, сохранены) в файлах. Вы можете просто отправить его по сети, если хотите, а затем создать экземпляр, используя Class.forName(). Кроме того, вы можете сделать лучше: использовать HttpClassLoader, передать ему URL-адрес HTTP, где доступен ваш класс, создать экземпляр класса с помощью этого загрузчика классов и запустить любой метод, который вы хотите.

Ответ 3

вы можете использовать следующую оболочку, чтобы разрешить сериализацию метода:

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);
        }
    }
}

Ответ 4

Если вам просто интересно, возможно ли это, то нет, он не реализует Serializable. Кроме того, Method является окончательным классом, поэтому вы не можете подклассифицировать его, чтобы добавить некоторые функции.

Ответ 5

Собственно, все методы являются частью их класса, а Class реализует Serializable. Так как вам нужен объект класса, чтобы вызвать метод, вы можете просто отправить класс (или объект).

Однако на принимающей стороне обычно создается объект версии этого класса.

Если вы хотите использовать это для вызова своего метода на удаленной стороне, взгляните на RMI (package java.rmi.*) - он также поддерживает отправку объектов, когда удаленная сторона еще не имеет данные класса.

Ответ 7

Python позволяет травление методов верхнего уровня, в Java способ вызова методов на другом хосте - через какие-то механизмы RMI. Байт-код класса может быть отправлен по кабелю и заданы все зависимости - используйте URLClassloader, чтобы сделать это.