Я хочу создать собственный клиент удаленного выполнения для своего приложения. Клиент может выглядеть примерно так:
interface Client {
<T> T computeRemotely(Function<List<MyBigObject>, T> consumer)
}
и может использоваться следующим образом:
Client client = new Client();
Integer remoteResult = client.computeRemotely(list -> {
Integer result = -1;
// do some computational work here.
return result;
});
Это означает, что мне каким-то образом нужно взять лямбда-выражение от клиента, отправить его на сервер, запустить функцию (передав реальный List<MyBigObject>
) и отправить результат обратно.
Стоит отметить, что ограничение на использование моей клиентской библиотеки заключается в том, что вы не можете использовать что-либо вне JDK в этой лямбде и ожидать, что она будет работать (поскольку классы могут не находиться в пути к классам на сервере)... но я бы хотел, чтобы они чтобы иметь возможность использовать любой из классов JDK для внесения собственных данных в расчет.
Теперь я не могу просто сериализовать лямбду Function<MyBigObject, T>
, потому что она сериализуется как внутренний клиент любого класса, в котором существует лямбда, который НЕ будет находиться в пути к классам на сервере.
Поэтому я смотрел на ASM, чтобы увидеть, может ли это работать. Учитывая, что я никогда раньше не занимался манипуляциями с байт-кодом, я просто хотел проверить, правильно ли я говорю:
- Я могу использовать ASM для преобразования для чтения класса, в котором находится лямбда.
- Используя посетитель метода, получите байты метода, отправьте их на сервер
- Используйте ASM, чтобы создать экземпляр из байтов и выполнить его.
Учитывая, что лямбда похожа на анонимный внутренний класс, я предполагаю, что мне тоже придется сделать какое-то переименование метода.
Это примерно правильно или я совсем не туда попал?