@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, вроде то, что нужно (но больше сказать не могу ибо лично не знаком).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы