Задать вопрос
@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 просмотров
Подписаться 1 Оценить Комментировать
Ответ пользователя aol-nnov К ответам на вопрос (3)
@aol-nnov
javassist или asm какой-нить не стоит рассмотреть?
Ответ написан
Комментировать