@Joysi75

Как в Java 7 сериализовать, вернее сохранить байт код функций с возможностью дальнейшей загрузки?

Прошу заранее прощения за длинные участки кода и буду благодарен кто их просмотрит.
Исходный код
import java.io.*;
import java.util.ArrayList;

public class ListOfFunc implements Serializable{
    interface Executable extends Serializable {  void execute(); }
    ArrayList<Executable> alFunc = new ArrayList<>();
    private static Executable exec1 =new Executable() {
        @Override
        public void execute() { System.out.println("exec func1"); }
    };
    private static Executable exec2 =new Executable() {
        @Override
        public void execute() { System.out.println("exec func2"); }
    };

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ListOfFunc lf1 =new ListOfFunc();
        lf1.alFunc.add(exec1);
        lf1.alFunc.add(exec2);
        lf1.alFunc.get(0).execute();
        lf1.alFunc.get(1).execute();

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data1.dat"));
        oos.writeObject(lf1);
        oos.close();

        System.out.println("after loading:");
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data1.dat"));
        ListOfFunc ex2 = (ListOfFunc) ois.readObject();
        ois.close();
        ex2.alFunc.get(0).execute();
        ex2.alFunc.get(1).execute();
    }
}

Отрабатывает на ура, сериализирует и десириализирует. Вывод:
exec func1
exec func2
after loading:
exec func1
exec func2

Но хочется сделать версию сериализацию, такой чтобы в исходной программе не описывать внутренности реализации функций, чтобы они выгружались (в виде байт-кода etc) и в дальнейшем подгружались без описания реализаций функций.
Чтобы когда либо в прошлом сформировать банк функций, сохранить его в виде файла. И как-нибудь в дальнейшем загрузить таким вот простым способом (без описания тысяч тел функций завернутых в интерфейсы):
import java.io.*;
import java.util.ArrayList;

public class ListOfFunc implements Serializable{
    interface Executable extends Serializable {  void execute(); }
    ArrayList<Executable> alFunc = new ArrayList<>();
   
    public static void main(String[] args) throws IOException, ClassNotFoundException {

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data1.dat"));
        ListOfFunc ex2 = (ListOfFunc) ois.readObject();
        ois.close();
        // Запустить подряд все загруженные функции
        for (int i = 0; i < ex2.alFunc.size(); i++)  ex2.alFunc.get(i).execute();
    }
}

Данный пример естественно даст ошибку local class incompatible: stream classdesc serialVersionUID = ... так как нет описания private static Executable. Может есть иные механизмы, не связанные с сериализацией, но имеющие заветные Save и парный Load для реализации последнего примера. Или, может, дадите мне направление в нужную сторону для реализации подобного?

P.S. Готов даже до Java8 дорасти.
  • Вопрос задан
  • 186 просмотров
Пригласить эксперта
Ответы на вопрос 3
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Насколько я знаю, этого сделать нельзя. Вот тут подробно описано, что происходит и что получается при сериализации: https://habrahabr.ru/post/60317/ Кратко: байткод методов туда не пишется.
Но, мне кажется, вашу задачу можно решить без сериализации. Создать jar с этими классами, потом загружать его динамически. stackoverflow.com/questions/11016092/how-to-load-c...
Ответ написан
@aol-nnov
javassist или asm какой-нить не стоит рассмотреть?
Ответ написан
Комментировать
dkt11
@dkt11
Developer
Можно откомпилировать класс и сохранить байт код (файлом, в базу данных, и т.д.). (Сериализация тут не причем). А после динамически подгружать и выполнять уже байт код.
Еще можно почитать о rule sets, вроде то, что нужно (но больше сказать не могу ибо лично не знаком).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы